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.
$ python ./my_script.py
(especificandopython
explícitamente), la línea shebang (#!
) se ignora. Solo tiene efecto si ejecuta el script como ejecutable, por ejemplo$ ./my_script.py
.Respuestas:
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
python
que 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
python
ejecutable en el directorio actual cuando se ejecuta el script. No recomendado.fuente
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.
fuente
El ejecutable de Python puede estar instalado en una ubicación distinta a / usr / bin, pero
env
casi siempre está presente en esa ubicación, por lo que su uso/usr/bin/env
es más portátil.fuente
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
env
para 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: especificarpython
mediante leenv
permite especificar de forma abstractapython
sin conocer su ruta).fuente
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
fuente
Se
/usr/bin/env python
vuelve muy útil cuando sus scripts dependen de la configuración del entorno, por ejemplo, si utilizan scripts que dependen depython 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 python
menos 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í .
fuente