¿Debo 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: elproyecto tornado usa el shebang. Por otro lado, elproyecto Django no.
python
shell
python-3.x
shebang
codificador de árboles
fuente
fuente
#!/usr/bin/python
compara con la primera opción? Veo esto en muchos códigos de ejemplo. Editar: Tal vez esta sea la respuesta ... stackoverflow.com/a/2429517/1156245Respuestas:
La línea shebang en cualquier secuencia de comandos determina la capacidad de la secuencia de comandos para ejecutarse como un ejecutable independiente sin escribir de
python
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 allí para que cuando alguien vea el archivo abierto en un editor, inmediatamente sepan lo que están viendo. Sin embargo, qué línea de shebang usas ES importante.El uso correcto de los scripts de Python 3 es:
Esto predeterminado a la versión 3.latest. Para Python 2.7. Uso posterior
python2
en lugar depython3
.Lo siguiente no se debe utilizar (excepto en el caso raro que usted está escribiendo código que es compatible tanto con Python 2.x y 3.x):
La razón de estas recomendaciones, dadas en PEP 394 , es que
python
pueden referirse a diferentes sistemaspython2
opython3
en ellos. Actualmente se refiere a lapython2
mayoría de las distribuciones, pero es probable que eso cambie en algún momento.Además, NO USE:
- "#! / usr / bin / env python" frente a "#! / usr / local / bin / python"
fuente
/usr/bin
entonces ¿cómo puede estar seguro de queenv
se encontrará en/usr/bin
? Si python se instala en un lugar no estándar, es probable que python esté configurado de manera no estándar y que, como resultado, el script deba fallar rápidamente. En lugar de hacer suposiciones sobre las propiedades del intérprete de Python y esperar lo mejor.env
serán siempre pueden encontrar en/usr/bin/
, y su trabajo consiste en localizar los contenedores (como Python) usandoPATH
. No importa cómo esté instalado python, su ruta se agregará a esta variable y laenv
encontrará (si no, python no está instalado). Ese es el trabajo deenv
, esa es la razón por la cual existe. Es lo que alerta al entorno (configure las variables env, incluidas las rutas de instalación e incluya las rutas). La gente siempre ha entendido que este comando solo puede funcionar si siempre se encuentra en el mismo lugar. Eso es solo un hecho/usr/bin/env
no está garantizado por ningún estándar, aparte de una regla ampliamente adoptada (¿universalmente?) ...python
ejecutable cuando el script es compatible con Python 2 y Python 3. De lo contrario, debe apuntar a la elección apropiada depython2
ypython3
.Realmente 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
python
que debe invocarse manualmente.El resultado final de ejecutar el programa no se ve afectado de ninguna manera; son solo opciones de los medios.
fuente
chmod a+x [your-script].py
debería hacerlo ejecutable y luego puede llamar./[your-script.py]
a shell.Pon un shebang en un script de Python para indicar:
python
ejecutable explícitamenteSi escribe un shebang manualmente, úselo siempre, a
#!/usr/bin/env python
menos que tenga 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 de Python específico, 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 por lassetuptools
herramientas del paquete de distribución (en Windows,setuptools
puede generar.exe
scripts de envoltura automáticamente).En otras palabras, si el script está en un proceso de pago de origen, entonces 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 la última categoría manualmente).Para elegir si debe usar
python
,python2
opython3
en el shebang, consulte PEP 394 - El comando "python" en sistemas tipo Unix :fuente
#!/usr/bin/env python
sí misma?#!/usr/bin/env python
. Por favor no sugiera "usar siempre"#!/usr/bin/env python
. Esto es incorrecto en el 99% de los casos (la razón que ha incluido en su respuesta).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 el correcto cuando el script se ejecuta directamente, por ejemplo:
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 importación, en cuyo caso se ignora el she-bang. Pero para los scripts ejecutados directamente, esta es una razón decente 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 virtualenv.fuente
which
le darán una cadena que funcionará, punto. No necesita preocuparse por ninguno de los intestinos para usarlo.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.
fuente
which
seleccionará automáticamente el valor predeterminado que utilizan los comandos del sistema y demás. Es genérico y el sistema lo dirige a la instalación adecuada.El propósito de shebang es que el script reconozca el tipo de intérprete cuando desea ejecutar el script desde el shell. Principalmente, y no siempre, ejecuta scripts al proporcionar 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 "portátil" es porque
/usr/bin/env
contiene suPATH
declaración que explica todos los destinos donde residen los ejecutables de su sistema.NOTA: Tornado no usa estrictamente shebangs, y Django estrictamente no lo hace. Varía según cómo esté ejecutando la función principal de su aplicación.
TAMBIÉN: No varía con Python.
fuente
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
#!
único propósito es lanzar el script. Django carga las fuentes por sí solo y las usa. Nunca necesita decidir qué intérprete debe usarse. De esta manera, la#!
realidad no tiene sentido aquí.Generalmente, si es un módulo y no se puede usar como un script, no hay necesidad de usar el
#!
. Por otro lado, una fuente de módulo a menudo contieneif __name__ == '__main__': ...
al menos algunas pruebas triviales de la funcionalidad. Entonces el#!
tiene sentido de nuevo.Una buena razón para usarlo
#!
es cuando usa los scripts Python 2 y Python 3: deben ser interpretados por diferentes versiones de Python. De esta manera, debe recordar quépython
debe usarse al iniciar el script manualmente (sin el#!
interior). Si tiene una mezcla de tales scripts, es una buena idea usar el#!
interior, hacerlos ejecutables y ejecutarlos como ejecutables (chmod ...).Al usar MS-Windows,
#!
no tenía sentido, hasta hace poco. Python 3.3 presenta 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 el indicador de ejecución en sistemas basados en Unix.fuente
Cuando instalé Python 3.6.1 en Windows 7 recientemente, también instalé Python Launcher para Windows, que se supone que maneja la línea shebang. Sin embargo, descubrí que Python Launcher no hizo esto: la línea shebang fue ignorada y Python 2.7.13 siempre se usó (a menos que ejecute 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 valorde mi instalación anterior de Python 2.7. Modifiqué este valor de clave de registro a
y el procesamiento de la línea shebang de Python Launcher funcionó como se describió anteriormente.
fuente
Si tiene diferentes módulos instalados y necesita usar una instalación específica de Python, entonces shebang parece estar limitado al principio. Sin embargo, puede hacer trucos como el siguiente para permitir que se invoque el shebang primero como un script de shell y luego elija python. Esto es muy flexible:
O mejor aún, tal vez, para facilitar la reutilización del código en múltiples scripts de Python:
y luego select.sh tiene:
fuente
Respuesta: Solo si planea convertirlo en un script ejecutable de línea de comandos.
Aquí está el procedimiento:
Comience verificando la cadena shebang adecuada para usar:
Tome el resultado de eso y agréguelo (con el shebang #!) En la primera línea.
En mi sistema responde así:
Entonces su shebang se verá así:
Después de guardar, seguirá ejecutándose como antes, ya que Python verá esa primera línea como un comentario.
Para convertirlo en un comando, cópielo para soltar la extensión .py.
Dígale al sistema de archivos que esto será ejecutable:
Para probarlo, use:
La mejor práctica es moverlo a algún lugar de su $ PATH, por lo que todo lo que necesita escribir es el nombre del archivo.
De esa manera funcionará en todas partes (sin el ./ antes del nombre del archivo)
fuente
Ruta absoluta vs lógica:
Esta es realmente una pregunta sobre si la ruta al intérprete de Python debe ser absoluta o lógica (
/usr/bin/env
) con respecto a la portabilidad.Al encontrar otras respuestas en este y otros sitios de Stack que hablaron sobre el tema de manera general sin pruebas de apoyo, realicé algunas pruebas y análisis realmente, REALMENTE , granulares sobre esta misma pregunta en unix.stackexchange.com . En lugar de pegar esa respuesta aquí, señalaré a los interesados en el análisis comparativo a esa respuesta:
https://unix.stackexchange.com/a/566019/334294
Como ingeniero de Linux, mi objetivo siempre es proporcionar los hosts más adecuados y optimizados para mis clientes desarrolladores, por lo que el problema de los entornos Python era algo para lo que realmente necesitaba una respuesta sólida. Mi opinión después de la prueba fue que la ruta lógica en el she-bang era la mejor de las (2) opciones.
fuente
Usar primero
Esto dará el resultado como la ubicación donde está presente mi intérprete de Python (binario).
Esta salida podría ser cualquiera como
o
Ahora seleccione apropiadamente la línea shebang y úsela.
Para generalizar podemos usar:
o
fuente
#!/usr/bin/env
toma la decisión correcta para ti.which
comando: devolverá la cadena correcta para su sistema en particular.which python
de nuevo y cambia la secuencia de comandos si los difiere de salida de la corriente tinglado