python == python2 O python == python3? ¿Cómo empaquetar, distribuir scripts python py2k?

10

Dependiendo del sistema, python== python2o python== python3.

Los scripts ejecutables de Python comienzan con:

#!/usr/bin/env python
#!/usr/bin/env python2
#!/usr/bin/env python3...

Para python py3k se proporciona en la documentación que debería / puedo usar con el número de versión , así que hago esto:

#!/usr/bin/env python3

Pero he encontrado un problema con los scripts py2k.

Mientras que en la documentación py2k está escrito para el uso: #! /usr/bin/env python,

en algunos * nix-es python py3k es el predeterminado, por lo que python == python3. (Por ejemplo , el paquete Python de ArchLinux , aquí los archivos del paquete Python ).

¿Cómo empaquetar (configurar, crear) y / o preparar scripts de Python para su distribución para manejar eso?

Pregunto acerca de cómo hacer paquetes de software que los usuarios puedan ejecutar fácilmente (sin modificar su entorno)

¿Puedo hacer el mismo truco para los scripts python py2k que para los scripts python py3k y configurarlo como #!/usr/bin/env python2:? ¿Puedo estar seguro de que cada distribución python py2k contiene un python2archivo, por #!/usr/bin/env python2lo que funcionará?

En caso afirmativo, ¿por qué no se propone como estándar, por ejemplo, en la documentación de python py2k ?

Grzegorz Wierzowiecki
fuente
44
Hasta donde sé, siempre puedes usarlo python2para ejecutarlo (si está instalado), y siempre puedes verificar la versión con python -V. si desea que pythonsea ​​2 o 3, debe rm /usr/bin/pythony luego crear un enlace simbólico que apunte desde su versión de Python deseada, por ejemplo ln -s /usr/bin/python2.5 /usr/bin/python.
Hanan N.
Gracias por asegurarme acerca de python2. Me pregunto por qué no es estándar usarlo cuando hay py2k y py3k y el valor predeterminado pythonpuede diferir. ¿Qué pasa con su consejo sobre la eliminación ? No es apropiado para este ejemplo, porque le pregunto sobre el embalaje. Me gustaría hacer un paquete que pueda ejecutarse en diferentes configuraciones / sistemas. No hay forma de modificar el entorno. ¿Qué pasa con la verificación? No se aplica a Shebang , que yo sepa.
Grzegorz Wierzowiecki
Creo que lo que @Hanan N. está tratando de decirte es que si estás escribiendo código Python 2.x, entonces úsalo #!...python2en tus programas y si estás usando Python 3.x, úsalo #!...python3. No confíe en el sistema operativo para tener el enlace correcto si sabe que solo funcionará en una versión específica. Trabajo con sistemas que todavía tienen Python 1.5.2 instalado como /usr/bin/python: escribo código para manejar versiones anteriores de Python o uso python2.
Arcege
2
@Arcege No tengo un python2ejecutable en mi sistema (Debian squeeze). pythones un enlace simbólico a python2.6, y python3es un enlace simbólico a python3.1, pero no existe python2.
Gilles 'SO- deja de ser malvado'

Respuestas:

3

Un script puede verificar su versión de Python y, si es Python 3, reiniciarse usando Python 2. Agregue lo siguiente cerca del encabezado del script:

if sys.version > '3':
  python2 = os.popen('which python2 2> /dev/null').read().rstrip()
  if python2:
    args = sys.argv[:]
    args.insert(0,python2)
    os.execv(python2,args)
  else:
    sys.exit("%s requires Python Version 2 (python2 not in PATH)" % os.path.basename(__file__))

Esto utiliza el whichcomando del sistema para ubicarse python2en el entorno PATH. Luego se relanza con eso (o aborta si no puede encontrarlo).

Tenga en cuenta que el script debe ser una sintaxis válida de Python 3 para que se inicie en Python 3.

Además, cualquier salida debe ser vaciada antes de la execvllamada o se perderá. Agregar, por ejemplo, sys.stdout.flush()justo antes de la llamada a execvvaciará cualquier printdeclaración.

starfry
fuente
1

En versiones anteriores, puede haber solo en pythonlugar de python2. Para que tu línea sheebang sea más clara, puedes crear un enlace python2 -> pythonpara que puedas usarlo #!/usr/bin/env python2.

DocSalvager
fuente
Sin embargo, no resuelve el problema planteado. Porque la pregunta es cómo hacer que su script sea lo suficientemente portátil, para que pueda ejecutarse en todos los entornos mencionados (con "python" "python2", etc.)
Grzegorz Wierzowiecki
1

Creo que el "estándar" se define en https://www.python.org/dev/peps/pep-0394/

Este PEP proporciona una convención para garantizar que los scripts de Python puedan continuar siendo portables en los sistemas * nix, independientemente de la versión predeterminada del intérprete de Python (es decir, la versión invocada por el comando python).

  • python2 se referirá a alguna versión de Python 2.x.
  • python3 se referirá a alguna versión de Python 3.x.
  • Por el momento, todas las distribuciones deben garantizar que python se refiera al mismo objetivo que python2.
  • sin embargo, los usuarios finales deben tener en cuenta que python se refiere a python3 en al menos Arch Linux (ese cambio es lo que provocó la creación de este PEP), por lo que python debe usarse en la línea shebang solo para scripts que sean compatibles con Python 2 y 3.
  • En preparación para un cambio eventual en la versión predeterminada de Python, los scripts de Python 2 solo deben actualizarse para que sean compatibles con Python 3 o bien para usar python2 en la línea shebang.
Fuerte
fuente