2012-08-22 14 views
14

Tengo un problema al intentar ejecutar un script de python en dos computadoras diferentes. En cada computadora me gustaría ejecutar el script usando la versión 2.7.3 de Python; sin embargo, el problema que tengo es que las dos computadoras nombran a python 2.7.3 de diferentes maneras. Una de las computadoras ejecuta arch Linux y en esta computadora se llama python2. La otra computadora ejecuta redhat linux y usa el nombre python2.7.3.Línea de shebang condicional para diferentes versiones de Python

¿Qué debo usar en la línea de shebang para que la secuencia de comandos sea ejecutable en ambas computadoras sin requerir ningún cambio? Lo que realmente quiero es algún tipo de línea de shebang condicional que pueda elegir qué versión de Python usar. ¿Acaso no tengo suerte y tengo que guardar dos versiones diferentes del guión?

P.S. No puedo usar #!/Usr/bin/env python ya que en la computadora de arch Linux se referiría a python 3.2.3 y en la computadora de redhat linux se referiría a python 2.4.

+4

, una magnífica pregunta. Tenga en cuenta que la práctica recomendada (según PEP-394) sugiere que python2.x se vincule simbólicamente como 'python2', por lo que realmente se trata de un problema de empaquetado en nombre de Redhat (entre otras distros). – WhyNotHugo

+2

¿Por qué no puedes definir una nueva variable en cada computadora que se vinculará con python2.7.3? o solo un enlace? – slallum

+2

Siempre puede ir con 'python2.7.3 my-program.py' :) – Shaung

Respuesta

5

Puede escribir una secuencia de comandos de contenedor pequeño que examine las diferentes versiones de los ejecutables de Python y use la que encuentre.

Por ejemplo:

#!/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 

Por supuesto, este guión es sólo una muestra de inicio, puede sin duda mejorar de muchas maneras. Solo te doy una idea de lo que quiero decir.

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 

tomado de https://github.com/apache/cassandra/blob/trunk/bin/cqlsh

Cuestiones relacionadas