Pregunta

En el comienzo de todos mis ejecutable de Python scripts que poner el shebang línea:

#!/usr/bin/env python

Me estoy quedando estas secuencias de comandos en un sistema donde env python los rendimientos de Python 2.2 medio ambiente.Mi guiones rápidamente fallar porque tengo un control manual para una compatible con la versión de Python:

if sys.version_info < (2, 4):
    raise ImportError("Cannot run with Python version < 2.4")

No quiero tener que cambiar el shebang línea en cada archivo ejecutable, si es posible;sin embargo, no tengo acceso administrativo a la máquina para cambiar el resultado de env python y no quiero forzar una versión particular, como en:

#!/usr/bin/env python2.4

Me gustaría evitar esto porque el sistema puede tener una nueva versión de Python 2.4, o puede tener Python 2.5, pero no de Python 2.4.

¿Cuál es la solución elegante?

[Modificar:] yo no era lo suficientemente específico en el planteamiento de la pregunta: me gustaría que permiten a los usuarios ejecutar las secuencias de comandos sin necesidad de configuración manual (por ejemplo,ruta de alteración o crear enlace simbólico para en ~/bin y asegurarse de que el CAMINO ha ~/bin antes de que el Python 2.2 ruta de acceso).Tal vez algunos de distribución de la utilidad es necesaria para evitar que el manual de ajustes?

¿Fue útil?

Solución

"env" simplemente ejecuta la primera cosa que se encuentra en la RUTA de env var.Para cambiar a diferentes python, anteponer el directorio para que python ejecutable a la ruta antes de invocar el script.

Otros consejos

Bastante hackish solución - si la verificación falla, el uso de esta función (que probablemente podría ser significativamente mejorado) para determinar el mejor intérprete disponible, determinar si es aceptable, y si es así relanzar su secuencia de comandos con el sistema operativo.sistema o algo similar y su sys.argv utilizando el nuevo intérprete.

import os
import glob
def best_python():
    plist = []
    for i in os.getenv("PATH").split(":"):
        for j in glob.glob(os.path.join(i, "python2.[0-9]")):
             plist.append(os.path.join(i, j))
    plist.sort()
    plist.reverse()
    if len(plist) == 0: return None
    return plist[0]

Si ejecuta las secuencias de comandos, a continuación, puede configurar la variable PATH para que apunte a un directorio bin de primera:

$ mkdir ~/bin
$ ln -s `which python2.4` ~/bin/python
$ export PATH=~/bin:$PATH

Luego al ejecutar la secuencia de comandos de python que va a usar python 2.4.Usted tendrá que cambiar su scripts de inicio de sesión para cambiar de rumbo.

Alternativamente ejecutar el script de python con la explícita intérprete que usted desee:

$ /path/to/python2.4 <your script>

@morais:Que es una idea interesante, pero creo que tal vez podemos llevar un paso más allá.Tal vez hay una forma de usar Ian Bicicleta del virtualenv a:

  • A ver si nos estamos quedando en un ambiente aceptable para empezar, y si es así, no hacer nada.
  • Comprobar si existe una versión ejecutable específico en el PATH, es decir,compruebe si python2.x existe for x in reverse(range(4, 10)).Si es así, vuelva a ejecutar el comando con la mejor intérprete.
  • Si no mejor intérprete existe, usar virtualenv para intentar instalar una nueva versión de Python desde la versión anterior de Python y obtener los paquetes necesarios.

No tengo idea de si virtualenv es capaz de esto, así que voy a ir un lío con ella en algún momento pronto.:)

He aquí una solución si estás (1) absolutamente conjunto sobre el uso de shebangs y (2) capaz de utilizar las Autotools en su proceso de construcción.

Me acabo de enterar de anoche, que se puede utilizar la macro autoconf AM_PATH_PYTHON para encontrar un mínimo de Python 2 binario.El cómo es aquí.

Así, el proceso sería:

  • Un problema AM_PATH_PYTHON(2.4) en su configure.ac
  • Cambiar el nombre de todos los de su .py secuencias de comandos para .py.in (en mi experiencia, esto no confundir vi)
  • Nombre de todas esas secuencias de comandos de Python que se desea generar con AC_CONFIG_FILES.
  • En lugar de comenzar con #!/usr/bin/env python, uso #!@PYTHON@

Luego de su resultante Secuencias de comandos de Python siempre tendrá un adecuado proceso.

Así, usted tiene esta solución, al menos posible, si no es práctico.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top