python shell python-3.x shebang

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



shell python-3.x (10)

¿Debo poner el shebang en mis scripts de Python?

Coloque un shebang en un script 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 explícitamente el ejecutable de python

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

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

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 activa un virtualenv en su shell. Afortunadamente, el shebang correcto se crea automáticamente en la mayoría de los casos mediante setuptools o las herramientas de su paquete de distribución (en Windows, setuptools puede generar scripts .exe envoltorio automáticamente).

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

Para elegir si debes usar python , python2 o python3 en el shebang, consulta PEP394 :

  • ... python debe usarse en la línea shebang solo para scripts que son compatibles con Source con Python 2 y 3.

  • En preparación para un eventual cambio en la versión predeterminada de Python, solo se deben actualizar las secuencias de comandos de Python 2 para que sean compatibles con la fuente de Python 3 o bien para usar python2 en la línea shebang.

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

#!/usr/bin/env python

o

#!/usr/local/bin/python

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

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


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

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

En mi sistema responde así:

$which python /usr/bin/python

Así que tu shebang se verá como:

#!/usr/bin/python

Después de guardar, todavía se ejecutará como antes, ya que Python verá esa primera línea como un comentario.

python filename.py

Para convertirlo en un comando, cópielo para quitar la extensión .py.

cp filename.py filename

Dígale 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 de su $ PATH, de modo que todo lo que necesita escribir es el nombre del archivo.

sudo cp filename /usr/sbin

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


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

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

En general, si es un módulo y no se puede usar como script, no es necesario usar 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 se usan las secuencias de comandos de Python 2 y Python 3; deben interpretarse con diferentes versiones de Python. De esta manera, debes recordar qué python debe usarse cuando ejecutes el script manualmente (sin el #! Adentro). Si tiene una mezcla de dichos scripts, es una buena idea usar el #! Dentro, conviértalos en ejecutables, y ejecútelos como ejecutables (chmod ...).

Cuando se utiliza MS-Windows, el #! No tenía sentido - hasta hace poco. Python 3.3 introduce un Iniciador de Python para Windows (py.exe y pyw.exe) que lee el #! línea, detecta las versiones instaladas de Python y usa la versión correcta o explícitamente deseada de Python. Como la extensión puede asociarse con un programa, puede obtener un comportamiento similar en Windows que con el indicador de ejecución en sistemas basados ​​en Unix.


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, encontré que el Python Launcher no hizo esto: se ignoró la línea shebang y siempre se usó Python 2.7.13 (a menos que ejecuté 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. He modificado este valor de clave de registro para

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

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


Debes 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.


El propósito de shebang es que la secuencia de comandos reconozca el tipo de intérprete cuando desea ejecutar la secuencia de comandos desde el shell. Principalmente, y no siempre, usted ejecuta scripts suministrando el intérprete externamente. Ejemplo de uso: python-xx script.py

Esto funcionará incluso si no tienes un declarador shebang.

Por qué el primero es más "portátil" es porque /usr/bin/env contiene su declaración PATH que representa todos los destinos donde residen los ejecutables de su sistema.

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

TAMBIÉN: No varía con Python.


La línea shebang en cualquier secuencia de comandos determina la capacidad de la secuencia de comandos para ejecutarse como un ejecutable independiente sin tener que escribir python 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 coloca allí para que cuando alguien ve el archivo abierto en un editor, inmediatamente sepa lo que está viendo. Sin embargo, qué línea de shebang usas es importante.

El uso correcto de los scripts de Python 3 es:

#!/usr/bin/env python3

Esto por defecto es la versión 3.latest. Para Python 2.7.latest use python2 en lugar de python3 .

NO se debe usar lo siguiente (excepto en el caso poco frecuente 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 que 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 esos casos, el #! anterior fallará".

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


Realmente 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 significa que python debe invocarse manualmente.

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


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

#!/usr/bin/python2.7

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

#!/usr/bin/env python es generalmente 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 #!/usr/bin/env python genérico identificaría la instancia correcta de Python para el virtualenv.


Usar primero

which python

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

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 utilizar:

#!/usr/bin/env

o

#!/bin/env