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


¿Debería poner el shebang en mis scripts de Python? ¿En que forma?

#!/usr/bin/env python 

o

#!/usr/local/bin/python

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

Nota: el tornado el proyecto usa el shebang. Por otro lado Django proyecto no.


505
2017-08-02 06:35


origen


Respuestas:


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

Correcto el uso de las secuencias de comandos de Python 3 es:

#!/usr/bin/env python3

Esto está predeterminado a la versión 3.latest. Para Python 2.7.primer uso python2 en lugar de python3.

El seguimiento No debería ser usado (excepto en el raro caso de que esté escribiendo un código que sea compatible con Python 2.xy 3.x):

#!/usr/bin/env python

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

Además, NO use:

#!/usr/local/bin/python

"python puede instalarse en / usr / bin / python o / bin / python en aquellos   casos, el anterior #! fallará."

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


705
2017-10-10 19:58



Es solo una cuestión de gusto. Agregar el shebang significa que las personas pueden invocar el script directamente si lo desean (suponiendo que esté marcado como ejecutable); omitirlo solo significa python tiene que ser invocado manualmente.

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


65
2017-08-02 06:39



¿Debería poner el shebang en mis scripts de Python?

Ponga un shebang en una secuencia de comandos de 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 estos igualmente portátiles? ¿Qué forma se usa más?

Si escribes un shebang a mano entonces siempre usa #!/usr/bin/env python a menos que tenga una razón específica para no usarlo. Esta forma se entiende incluso en Windows (lanzador de Python).

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

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

Para elegir si debes usar python, python2, o python3 en el shebang, ver PEP 394: el comando "python" en sistemas similares a Unix:

  • ... python debe usarse en la línea shebang solo para los scripts que están   fuente compatible con Python 2 y 3.

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


19
2017-08-12 01:58



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

#!/usr/bin/python2.7

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

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

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


14
2017-08-10 18:57



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 son distutils y Distribute.


10
2017-08-02 07:42



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

Esto funcionará incluso si no tienes un declarante shebang.

Por qué el primero es más "portátil" es porque, /usr/bin/env contiene tu PATH declaración que da cuenta de todos los destinos donde residen sus archivos ejecutables del sistema.

NOTA: Tornado no utiliza estrictamente shebangs, y Django estrictamente no lo hace. Varía según la forma en que esté ejecutando la función principal de su aplicación.

TAMBIÉN: No varía con Python.


8
2017-08-02 06:45



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

los #! el único propósito es para lanzar el script. Django carga las fuentes por sí mismo y las usa. Nunca necesita decidir qué intérprete se debe usar. De esta manera, el #! en realidad no tiene sentido aquí.

En general, si se trata de un módulo y no se puede utilizar como script, no es necesario utilizar el #!. 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 #! tiene sentido de nuevo.

Una buena razón para usar #! es cuando usa los scripts de Python 2 y Python 3, deben ser interpretados por diferentes versiones de Python. De esta manera, debes recordar qué pythondebe utilizarse al iniciar el script manualmente (sin el #! dentro). Si tiene una combinación de tales scripts, es una buena idea usar #! adentro, hazlos ejecutables, y ejecútalos como ejecutables (chmod ...).

Cuando se usa MS-Windows, el #! no tenía sentido, hasta hace poco. Python 3.3 presenta un Windows Python Launcher (py.exe y pyw.exe) que lee el #! línea, detecta las versiones instaladas de Python, y utiliza 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 que con el indicador de ejecución en sistemas basados ​​en Unix.


7
2018-01-30 07:52



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

Aquí está el procedimiento:

Comience por verificar la cadena de shebang adecuada para usar:

which python

Tome la salida de eso y agréguela (¡con el shebang #!) En la primera línea.

En mi sistema, responde así:

$which python
/usr/bin/python

Entonces su shebang se verá así:

#!/usr/bin/python

Después de guardar, seguirá ejecutándose como antes, ya que Python verá esa primera línea como un comentario.

python filename.py

Para que sea un comando, cópielo para soltar la extensión .py.

cp filename.py filename

Indique al sistema de archivos que esto será ejecutable:

chmod +x filename

Para probarlo, usa:

./filename

La mejor práctica es moverlo a alguna parte de $ PATH, por lo que todo lo que necesita escribir es el nombre del archivo.

sudo cp filename /usr/sbin

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


3
2018-01-22 04:05



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

Para solucionar esto, tuve que editar la clave de 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. Modifiqué este valor de clave de registro para

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

y el procesamiento de línea shebang de Python Launcher funcionó como se describió anteriormente.


0
2018-06-02 01:40



Use primero

which python

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

Esta salida podría ser cualquiera como

/usr/bin/python

o

/bin/python

Ahora seleccione apropiadamente la línea de shebang y úselo.

Para generalizar podemos usar:

#!/usr/bin/env

o

#!/bin/env

0
2017-12-21 09:36