2012-08-22 16 views
14

Ho un problema quando si tenta di eseguire uno script python su due computer diversi. Su ogni computer mi piacerebbe eseguire lo script usando python versione 2.7.3, tuttavia il problema che sto avendo è che i due computer chiamano python 2.7.3 in modi diversi. Uno dei computer esegue arch linux e su questo computer è chiamato python2. L'altro computer sta eseguendo redhat linux e usa il nome python2.7.3.Linea shebang condizionale per diverse versioni di Python

Cosa devo usare nella riga shebang in modo che lo script sia eseguibile su entrambi i computer senza richiedere modifiche? Quello che voglio veramente è una sorta di linea di shebang condizionale che possa scegliere quale versione di Python usare. Sono solo sfortunato e devo mantenere due versioni differenti della sceneggiatura?

P.S. Non posso usare solo #!/Usr/bin/env python come nel computer arch linux, questo si riferirebbe a python 3.2.3 e sul computer Linux di redhat si riferirebbe a python 2.4.

+4

Un magnifico domanda. Si noti che la pratica raccomandata (secondo PEP-394) suggerisce che python2.x sia simulato come 'python2', quindi in realtà si tratta di una sorta di problema di packaging per conto di redhat (come altre distribuzioni). – WhyNotHugo

+2

Perché non puoi definire una nuova variabile in ogni computer che si collegherà a python2.7.3? o solo un link? – slallum

+2

Puoi sempre andare con 'python2.7.3 my-program.py' :) – Shaung

risposta

5

È possibile scrivere un piccolo script wrapper che esamina diverse versioni di eseguibili python e utilizza quello che trova.

Ad esempio:

#!/bin/sh -e 
pythons=('python2', 'python2.7.3') 
for py_exec in ${pythons[@]}; do 
    py_exec="/usr/bin/$py_exec" 
    if [[ -f $py_exec ]]; then 
     exec $py_exec $1 
    fi 
done 

Naturalmente questo script è solo un esempio di avvio, si potrebbe sicuramente migliorare in molti modi. Basta darti un'idea di cosa intendo.

6
#!/bin/sh 
# -*- mode: Python -*- 

""":" 
# bash code here; finds a suitable python interpreter and execs this file. 
# prefer unqualified "python" if suitable: 
python -c 'import sys; sys.exit(not (0x020500b0 < sys.hexversion < 0x03000000))' 2>/dev/null \ 
    && exec python "$0" "[email protected]" 
for pyver in 2.6 2.7 2.5; do 
    which python$pyver > /dev/null 2>&1 && exec python$pyver "$0" "[email protected]" 
done 
echo "No appropriate python interpreter found." >&2 
exit 1 
":""" 

import sys 
print sys.version 

tratto da https://github.com/apache/cassandra/blob/trunk/bin/cqlsh

Problemi correlati