2010-08-27 6 views
21

¿Existe una forma estándar de asegurarse de que python2 y no python3 interpretarán un script de python? En mi distribución, puedo usar #!/Usr/bin/env python2 como shebang, pero parece que no todas las distribuciones envían "python2". Podría llamar explícitamente a una versión específica (por ejemplo, 2.6) de Python, pero eso excluiría a las personas que no tienen esa versión.¿Existe una forma estándar de asegurarse de que python2 y no python3 interpretarán un script de python?

Me parece que esto va a ser un problema cada vez mayor cuando las distribuciones comiencen a poner python3 como el intérprete predeterminado de python.

Respuesta

7

Esto es un problema un poco complicado durante lo que será un período de transición muy largo. Desafortunadamente, no existe una forma infalible y multiplataforma de garantizar qué versión de Python se está invocando, salvo que el script de Python se compruebe una vez que se inicia. Muchas, sino la mayoría, de las distribuciones que envían Python 3 están asegurando que el comando genérico python tenga un alias por defecto a la versión más reciente de Python 2, mientras que python3 es un alias del más reciente Python 3. Aquellas distribuciones que no deberían ser alentadas a hacer asi que. Pero no hay garantía de que un usuario no anule eso.Creo que la mejor práctica disponible para el futuro previsible es que los empaquetadores, distribuidores y usuarios asuman que python se refiere a Python 2 y, cuando sea necesario, compilar una verificación en tiempo de ejecución en el script.

+0

Y, si es necesario, como señala kwatford en su comentario, incluya un cheque en el momento de la instalación en el script 'setup.py' del paquete o su equivalente, ya que' setuptools', 'Distribute',' pip' et al. generalmente altera las líneas de comando de los scripts para que apunten a la instancia de instalación de Python. –

+2

En mi humilde opinión, siempre debería haber disponible enlace simbólico 'python2' para hacer en el futuro, [shebangs claramente distinguibles] (http://unix.stackexchange.com/questions/26573/python-python2-or-python-python3-how- to-package-distribute-python-py2k) –

+1

@Grzegorz: Python PEP 394 está abierto en ese tema y probablemente se implementará en una futura actualización de Python 2: http://bugs.python.org/issue12627 –

11

http://docs.python.org/library/sys.html#sys.version_info

utilizando el módulo sys se puede determinar la versión de Python que se está ejecutando y elevar una excepción o salida o lo que quiera.

ACTUALIZACIÓN:

Usted puede usar esto para llamar al intérprete adecuado. Por ejemplo, configure un pequeño script que haga la verificación por usted y úselo en el shbang. Comprobaría la ejecución de la versión de python, y si no es lo que quieres, buscará la que quieras. Luego ejecutaría el script en esa versión de python (o fallaría si no se encontraba nada bueno).

+1

ver mi comentario a jathanism. –

0

Según tengo entendido, las diferentes distribuciones estarán en diferentes ubicaciones en su disco. Aquí hay algunas sugerencias que se le ocurren:

  1. Puede usar el alias de UNIX para crear accesos directos que apuntan a las diferentes distros. Ejemplo: alias py2 = "/ usr/bin/python2.X". Por lo tanto, cuando ejecuta su secuencia de comandos puede usar py2 xx.py
  2. O de otra manera podría ser modificar su variable de entorno PYTHON_PATH.
  3. O si no estoy equivocado, hay una disposición en el módulo sys para obtener el número de versión de python actual. Puede obtener ese acuerdo & de manera adecuada.

Esto debe hacerlo ...

+3

Estoy distribuyendo una aplicación de Python, mi problema es asegurarme de que ** todos los usuarios ** usen python2.x para ejecutar mi aplicación. –

7

Usando sys.version_info se puede hacer una prueba de valor simple en contra de ella. Por ejemplo, si sólo desea apoyar la versión 2.6 o inferior:

import sys 
if sys.version_info > (2,6): 
    sys.exit("Sorry, only we only support up to Python 2.6!") 
+1

Eso no es lo que quiero, quiero que el buen intérprete sea elegido automáticamente, no imprimir un mensaje de error si se elige el incorrecto: -/ –

+0

La respuesta definitiva a su pregunta es: "No, no hay una forma estándar de asegúrese de que python2 y no python3 interpretarán una secuencia de comandos python ". Lo que usted solicitó fue asegurarse de que Python2 se eligió en lugar de 3. No especificó que desea que el intérprete correcto sea elegido automáticamente. La única manera en que podría hacer esto con seguridad sería implementar una comprobación antes de llamar al programa (como con un script de shell) que luego ejecute su código de Python contra el intérprete de Python deseado. – jathanism

+2

Esperar que "el buen intérprete sea elegido automáticamente" es absurdo. Un archivo no puede forzar qué programa lo ejecuta. –

-1

creo que esto va a hacer lo que quiere, es decir, la prueba de una versión no específica de Python menos de 3.x (con tal de que doesn no contiene una declaración from __future__ import print_function).

try: 
    py3 = eval('print') 
except SyntaxError: 
    py3 = False 

if py3: exit('requires Python 2') 
... 

Funciona mediante pruebas para ver si print es una función incorporada en oposición a una declaración, como lo es en python3. Cuando no es una función, la función eval() generará una excepción, lo que significa que el código se está ejecutando en un intérprete anterior a Python 3.0 con la advertencia mencionada anteriormente.

2

No es exactamente la misma situación, pero la empresa para la que trabajo tiene una aplicación que puede ejecutar scripts de Python (entre sus muchas características). Después de numerosos problemas de soporte que involucran instalaciones de Python en varias plataformas, decidimos simplemente instalar nuestro propio intérprete de Python con la aplicación. De esta forma, sabemos exactamente dónde está instalado y qué versión es. Este enfoque puede ser demasiado pesado para sus necesidades (el paquete Python es solo el 10% de los bits de nuestra aplicación) pero definitivamente funciona.

+0

Esto es en realidad un gran enfoque que elimina todos los obstáculos necesarios para un requisito tan rígido. – jathanism

2

Depende de cómo lo está distribuyendo, supongo.

Si está utilizando un archivo normal setup.py para gestionar su distribución, tienen que bombardear a cabo si el usuario está tratando de instalarlo en Python 3.

Una vez instalado, el tinglado de la secuencia de comandos de la consola creada por (por ejemplo) setuptools probablemente estará vinculado al intérprete específico utilizado para instalarlo.

Si está haciendo algo extraño para su instalación, puede en cualquier script de instalación que esté buscando buscar intérpretes de Python y almacenar una opción. Primero debe verificar si lo que se llama "python" es un 2.x. De lo contrario, busca "python2.7", "python2.6", etc. para ver qué hay disponible.

0

Puede usar las herramientas automáticas para elegir un intérprete de Python 2. Here es cómo hacer eso. Garantizar un shebang correcto puede ser complicado de hacer elegantemente; here es una forma de hacerlo. Puede ser más fácil simplemente tener un script Bash luz envoltorio, wrapper.sh.in que se ve algo como:

#!/bin/bash 
PYTHON2="@[email protected]" #That first link enables this autotool variable 
"$PYTHON2" "[email protected]" #Call the desired Python 2 script with its arguments 

llamada wrapper.sh (después de un ./configure) como:

./wrapper.sh my_python2_script.py --an_option an_argument 
Cuestiones relacionadas