Debería poner #! (shebang) en scripts Python, ¿y qué forma debería tomar?


¿Debo poner el shebang en mis scripts Python? ¿En qué forma?

#!/usr/bin/env python 

O

#!/usr/local/bin/python

¿Son igualmente portátiles? ¿Qué forma se utiliza más?

Nota: el proyecto tornado utiliza el shebang. Por otro lado, el proyecto Django no lo hace.

Author: Mike T, 2011-08-02

10 answers

La línea shebang en cualquier script determina la capacidad del script para ser ejecutado como un ejecutable independiente sin escribir python de antemano en el terminal o al hacer doble clic en él en un administrador de archivos (cuando está configurado correctamente). No es necesario, pero generalmente se pone allí para que cuando alguien ve el archivo abierto en un editor, sepan inmediatamente lo que están mirando. Sin embargo, la línea shebang que utilice ES importante.

Uso correcto de para scripts de Python 3 is:

#!/usr/bin/env python3

Este valor predeterminado es la versión 3.reciente. Para Python 2.7.último uso python2 en lugar de python3.

El siguiente NO debe usarse (excepto en el raro caso de que esté escribiendo código que es compatible con ambos Python 2.x y 3.x):

#!/usr/bin/env python

La razón de estas recomendaciones, dado en PEP 394, es que python puede referirse a python2 o python3 en diferentes sistemas. Actualmente se refiere a python2 en la mayoría de las distribuciones, pero eso es es probable que cambie en algún momento.

Además, NO Utilice:

#!/usr/local/bin/python

"python puede ser instalado en /usr/bin/python o /bin/python en los casos, el anterior #! fallará."

--"#!/usr/bin / env python" vs "#!/usr / local / bin / python "

 739
Author: GlassGhost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-24 13:43:08

En realidad es solo una cuestión de gustos. Agregar el shebang significa que las personas pueden invocar el script directamente si lo desean (suponiendo que esté marcado como ejecutable); omitirlo solo significa que python debe invocarse manualmente.

El resultado final de ejecutar el programa no se ve afectado de ninguna manera; es solo opciones de los medios.

 66
Author: Amber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-02 06:39:30

¿Debo poner el shebang en mis scripts Python?

Poner un shebang en un script Python para indicar:

  • este módulo se puede ejecutar como un script
  • si se puede ejecutar solo en python2, python3 o es compatible con Python 2/3
  • en POSIX, es necesario si desea ejecutar el script directamente sin invocar python ejecutable explícitamente

¿Son igualmente portátiles? Qué forma se utiliza ¿la mayoría?

Si escribes un shebang manualmente entonces usa siempre #!/usr/bin/env python a menos que tengas una razón específica para no usarlo. Este formulario se entiende incluso en Windows (Python launcher).

Nota: los scripts instalados deben usar un ejecutable específico de python, por ejemplo, /usr/bin/python o /home/me/.virtualenvs/project/bin/python. Es malo si alguna herramienta se rompe si activas un virtualenv en tu shell. Afortunadamente, el shebang correcto se crea automáticamente en la mayoría de los casos por setuptools o sus herramientas de paquetes de distribución (en Windows, setuptools puede generar scripts wrapper .exe automáticamente).

En otras palabras, si el script está en un checkout de origen, probablemente verá #!/usr/bin/env python. Si está instalado, entonces el shebang es una ruta a un ejecutable específico de python como #!/usr/local/bin/python (NOTA: no debe escribir las rutas de esta última categoría manualmente).

Para elegir si debe usar python, python2, o python3 en el shebang, ver PEP 394 - El comando" python " en Unix-Like Sistemas :

  • ... python se debe usar en la línea shebang solo para scripts que son fuente compatible con Python 2 y 3.

  • En preparación para un eventual cambio en la versión por defecto de Python, solo los scripts de Python 2 deben actualizarse para ser fuente compatible con Python 3 o bien usar python2 en la línea shebang.

 21
Author: jfs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-12 09:54:02

Si tiene más de una versión de Python y el script necesita ejecutarse bajo una versión específica, she-bang puede garantizar que se use la correcta cuando el script se ejecuta directamente, por ejemplo:

#!/usr/bin/python2.7

Tenga en cuenta que el script todavía se puede ejecutar a través de una línea de comandos completa de Python, o a través de la importación, en cuyo caso se ignora she-bang. Pero para los scripts que se ejecutan directamente, esta es una razón decente para usar she-bang.

#!/usr/bin/env python es generalmente el mejor enfoque, pero esto ayuda con casos especiales.

Normalmente sería mejor establecer un entorno virtual Python, en cuyo caso el genérico #!/usr/bin/env python identificaría la instancia correcta de Python para el virtualenv.

 14
Author: Chris Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-01 01:23:21

Debe agregar un shebang si el script está destinado a ser ejecutable. También debe instalar el script con un software de instalación que modifique el shebang a algo correcto para que funcione en la plataforma de destino. Ejemplos de esto es distutils y Distribuir.

 10
Author: Lennart Regebro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-02 07:42:26

El propósito de shebang es que el script reconozca el tipo de intérprete cuando desee ejecutar el script desde el shell. En la mayoría de los casos, y no siempre, ejecuta scripts suministrando el intérprete externamente. Ejemplo de uso: python-x.x script.py

Esto funcionará incluso si no tienes un declarador shebang.

Por qué el primero es más "portable" es porque, /usr/bin/env contiene su declaración PATH que da cuenta de todos los destinos donde los ejecutables de su sistema residir.

NOTA: Tornado no usa estrictamente shebangs, y Django estrictamente no. Varía con la forma en que está ejecutando la función principal de su aplicación.

TAMBIÉN: No varía con Python.

 8
Author: meson10,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-29 11:57:02

A veces, si la respuesta no es muy clara (es decir, no puedes decidir si es sí o no), entonces no importa demasiado, y puedes ignorar el problema hasta que la respuesta sea clara.

El único propósito de #! es lanzar el script. Django carga las fuentes por su cuenta y las usa. Nunca necesita decidir qué intérprete debe usarse. De esta manera, el #! en realidad no tiene sentido aquí.

Generalmente, si es un módulo y no se puede usar como un script, no es necesario utilizar #!. Por otro lado, una fuente de módulo a menudo contiene if __name__ == '__main__': ... con al menos algunas pruebas triviales de la funcionalidad. Entonces el #! vuelve a tener sentido.

Una buena razón para usar #! es cuando se usan scripts Python 2 y Python 3 must deben ser interpretados por diferentes versiones de Python. De esta manera, debe recordar qué python se debe usar al iniciar el script manualmente (sin el #! dentro). Si usted tiene una mezcla de tales scripts, es una buena idea usar el #! dentro, hacerlos ejecutables, y lanzarlos como ejecutables (chmod ...).

Al usar MS-Windows, el #! no tenía sentido until hasta hace poco. Python 3.3 introduce un Lanzador de Python de Windows (py.exe y pyw.exe) que lee la línea #!, detecta las versiones instaladas de Python y usa la versión correcta o explícitamente deseada de Python. Como la extensión se puede asociar con un programa, puede obtener un comportamiento similar en Windows como con execute flag en sistemas basados en Unix.

 7
Author: pepr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-30 07:52:16

Cuando instalé Python 3.6.1 en Windows 7 recientemente, también instaló el Lanzador de Python para Windows, que se supone que maneja la línea shebang. Sin embargo, descubrí que el Lanzador de Python no hizo esto: la línea shebang fue ignorada y Python 2.7.13 siempre se usó (a menos que ejecutara el script usando py -3).

Para arreglar esto, tuve que editar la clave del registro de Windows HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\command. Esto todavía tenía el valor

"C:\Python27\python.exe" "%1" %*

De mi instalación anterior de Python 2.7. He modificado esto valor de la clave del registro a

"C:\Windows\py.exe" "%1" %*

Y el procesamiento de la línea shebang del lanzador de Python funcionó como se describió anteriormente.

 2
Author: ETalbot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-02 01:40:09

Respuesta: Solo si planea convertirlo en un script ejecutable de línea de comandos.

Aquí está el procedimiento:

Comience verificando la cadena de shebang adecuada para usar:

which python

Tome la salida de eso y añádala (con el shebang #!) en la primera línea.

En mi sistema responde así:

$which python
/usr/bin/python

Así que su shebang se verá como:

#!/usr/bin/python

Después de guardar, seguirá funcionando como antes, ya que python verá esa primera línea como una comentario.

python filename.py

Para convertirlo en un comando, cópialo para soltar la extensión .py.

cp filename.py filename

Dile al sistema de archivos que esto será ejecutable:

chmod +x filename

Para probarlo, use:

./filename

La mejor práctica es moverlo a algún lugar en su PATH PATH para que todo lo que necesita para escribir es el nombre del archivo en sí.

sudo cp filename /usr/sbin

De esa manera funcionará en todas partes (sin el ./ antes del nombre del archivo)

 2
Author: SDsolar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-08 01:51:32

Usar primero

which python

Esto dará la salida como la ubicación donde mi intérprete de python (binario) está presente.

Esta salida podría ser cualquiera como

/usr/bin/python

O

/bin/python

Ahora selecciona apropiadamente la línea shebang y úsala.

Para generalizar podemos usar:

#!/usr/bin/env

O

#!/bin/env
 -2
Author: frp farhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-10 16:09:11