Encabezado de la secuencia de comandos de Python

79

El encabezado típico debe ser

#!/usr/bin/env python

Pero descubrí que a continuación también funciona al ejecutar el script como $python ./my_script.py

#!/usr/bin/python
#!python

¿Cuál es la diferencia entre estos 2 encabezados? ¿Cuál podría ser el problema del segundo? También discuta el caso de que el intérprete de Python esté en PATH o no. Gracias.

Stan
fuente
3
ese encabezado se llama Shebang en.wikipedia.org/wiki/Shebang_%28Unix%29
systempuntoout
4
Para su información, cuando ejecuta un script de la manera $ python ./my_script.py(especificando pythonexplícitamente), la línea shebang ( #!) se ignora. Solo tiene efecto si ejecuta el script como ejecutable, por ejemplo $ ./my_script.py.
David Z
@David Zaslavsky: +1 Buena atrapada.
Mark Byers

Respuestas:

103

Primero, cada vez que ejecute un script utilizando el intérprete explícitamente, como en

$ python ./my_script.py
$ ksh ~/bin/redouble.sh
$ lua5.1 /usr/local/bin/osbf3

la #!línea siempre se ignora. La #!línea es una característica de Unix de scripts ejecutables solamente, y puede verla documentada en su totalidad en la página de manual deexecve(2) . Allí encontrará que la palabra siguiente #!debe ser el nombre de la ruta de un ejecutable válido. Entonces

#!/usr/bin/env python

ejecuta lo pythonque sea ​​que esté en los usuarios $PATH. Esta forma es resistente a que el intérprete de Python se mueva, lo que lo hace algo más portátil, pero también significa que el usuario puede anular el intérprete de Python estándar poniendo algo delante de él $PATH. Dependiendo de sus objetivos, este comportamiento puede ser correcto o no.

Próximo,

#!/usr/bin/python

trata el caso común en el que se instala un intérprete de Python /usr/bin. Si está instalado en otro lugar, pierde. Pero esta es una buena manera de asegurarse de obtener exactamente la versión que desea o, de lo contrario, nada en absoluto (comportamiento de "parada por falla"), como en

#!/usr/bin/python2.5

Finalmente,

#!python

sólo funciona si hay un pythonejecutable en el directorio actual cuando se ejecuta el script. No recomendado.

Norman Ramsey
fuente
28


Sugeriría 3 cosas al comienzo de su guión:

Primero, como ya se dijo, use el entorno:

#!/usr/bin/env python

En segundo lugar, configure su codificación:

# -*- coding: utf-8 -*-

En tercer lugar, establezca una cadena de documentos:

"""This is a awesome
    python script!"""

Y seguro que usaría " "(4 espacios) para ident.
El encabezado final se verá así:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""This is a awesome
        python script!"""


Mis mejores deseos y codificación feliz.

Dimitar Atanasov
fuente
Solo para respaldar el comentario aparentemente obstinado sobre los espacios sobre las pestañas: "Los espacios son el método de sangría preferido". ( python.org/dev/peps/pep-0008/#tabs-or-spaces )
deepelement
5

El ejecutable de Python puede estar instalado en una ubicación distinta a / usr / bin, pero envcasi siempre está presente en esa ubicación, por lo que su uso /usr/bin/enves más portátil.

Mark Byers
fuente
2

Desde la página de manual de env(GNU coreutils 6.10):

env - run a program in a modified environment

En teoría, podría utilizar envpara restablecer el entorno (eliminando muchas de las variables de entorno existentes) o agregar variables de entorno adicionales en el encabezado del script. Prácticamente hablando, las dos versiones que mencionaste son idénticas. (Aunque otros han mencionado un buen punto: especificar pythonmediante le envpermite especificar de forma abstracta pythonsin conocer su ruta).

Annika Backstrom
fuente
1

Sí, es posible que python no esté en /usr/bin, pero por ejemplo en /usr/local/bin(BSD).

Al usar virtualenv, incluso puede ser algo como ~/projects/env/bin/python

Almad
fuente
0

Se /usr/bin/env pythonvuelve muy útil cuando sus scripts dependen de la configuración del entorno, por ejemplo, si utilizan scripts que dependen de python virtualenv. Cada virtualenv tiene su propia versión del binario de Python que se requiere para agregar paquetes instalados en virtualenv a la ruta de Python (sin tocar PYTHONPATH env).

A medida que más y más personas han comenzado a usar virtualenv para el desarrollo de Python, prefieren usarlo a /usr/bin/env pythonmenos que no desee que las personas usen su binario personalizado de Python.

Nota: También debe comprender que existen posibles problemas de seguridad (en entornos multiusuario) cuando permite que las personas ejecuten sus scripts en sus entornos personalizados. Puede obtener algunas ideas desde aquí .

Jatin Kumar
fuente