¿Existe una forma estándar de asegurarse de que python2 interpretará un script de python y no python3?

¿Existe una forma estándar de asegurarse de que python2 interpretará un script de python y no python3? En mi distro, puedo usar #! / Usr / bin / env python2 como shebang, pero parece que no todas las distribuciones se 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.

Me parece que esto será cada vez más un problema cuando las distribuciones comenzarán a poner a python3 como el intérprete de python predeterminado.

Este es un problema un poco desordenado durante lo que será un período de tiempo de transición muy largo. Desafortunadamente, no existe una manera infalible y multiplataforma para garantizar qué versión de Python se invoca, más que para que el script de Python se verifique una vez que se haya iniciado. Muchas, si no la mayoría, de las distribuciones que se distribuyen en Python 3 aseguran que el comando genérico de python tenga un alias de manera predeterminada a la versión más reciente de Python 2, mientras que a python3 se le python3 alias al Python más reciente. 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 asumn que python refiere a Python 2 y, cuando sea necesario, cree un control de tiempo de ejecución en el script.

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

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

ACTUALIZAR:

Puede usar esto para llamar al intérprete apropiado. Por ejemplo, configure un pequeño script que haga la comprobación por usted, y utilícelo en el shbang. Verificará la versión de python que se está ejecutando y, si no es lo que desea, buscará la que desee. Luego ejecutaría el script en esa versión de python (o fallaría si no se encontraba nada bueno).

Usando sys.version_info puede hacer una prueba de valor simple contra ella. Por ejemplo, si solo desea admitir 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!") 

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 relacionados con las instalaciones de Python en varias plataformas, decidimos instalar nuestro propio intérprete de Python con la aplicación. De esa manera sabemos exactamente dónde está instalado y qué versión es. Este enfoque puede ser demasiado pesado para sus necesidades (el paquete de Python es solo alrededor del 10% de los bits de nuestra aplicación) pero definitivamente funciona.

Depende de cómo lo distribuyas, supongo.

Si está utilizando un archivo setup.py normal para administrar su distribución, setup.py que lo setup.py si el usuario está intentando instalarlo en Python 3.

Una vez que esté instalado, el shebang del script de consola creado 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 buscar los intérpretes de Python en cualquier secuencia de comandos de instalación y almacenar una opción. Primero debes verificar si lo que se llama “python” es un 2.x. Si no, revisa “python2.7”, “python2.6”, etc. para ver qué hay disponible.

Según tengo entendido, las diferentes distribuciones estarán en diferentes ubicaciones en su unidad. Aquí hay algunas sugerencias que vienen a la mente:

  1. Podría usar el alias de UNIX para crear accesos directos que apunten a las diferentes distribuciones. Ej .: alias py2 = “/ usr / bin / python2.X”. Entonces, cuando ejecutes tu script, puedes 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. Usted podría obtener eso y tratar adecuadamente.

Esto debería hacerlo …

Puede usar las herramientas automáticas para elegir un intérprete de Python 2. Aquí es cómo hacer eso. Garantizar un shebang correcto puede ser difícil de hacer con elegancia; Aquí hay una forma de hacerlo. Puede ser más fácil simplemente tener un script de envoltorio ligero de Bash, wrapper.sh.in que parezca algo como:

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

Llame a wrapper.sh (después de ./configure ) como:

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

Creo que esto hará lo que usted quiere, es decir, probar una versión no específica de Python con menos de 3.x (siempre que no contenga una 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 la print es una función integrada en lugar de una statement, 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 pre-Python 3.0 con la advertencia mencionada anteriormente.