¿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/pythoncompara 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
pythonantemano 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
python2en 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
pythonpueden referirse a diferentes sistemaspython2opython3en ellos. Actualmente se refiere a lapython2mayorí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/binentonces ¿cómo puede estar seguro de queenvse 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.envserá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 laenvencontrará (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/envno está garantizado por ningún estándar, aparte de una regla ampliamente adoptada (¿universalmente?) ...pythonejecutable cuando el script es compatible con Python 2 y Python 3. De lo contrario, debe apuntar a la elección apropiada depython2ypython3.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
pythonque 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].pydebería hacerlo ejecutable y luego puede llamar./[your-script.py]a shell.Pon un shebang en un script de Python para indicar:
pythonejecutable explícitamenteSi escribe un shebang manualmente, úselo siempre, a
#!/usr/bin/env pythonmenos 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/pythono/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 lassetuptoolsherramientas del paquete de distribución (en Windows,setuptoolspuede generar.exescripts 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,python2opython3en el shebang, consulte PEP 394 - El comando "python" en sistemas tipo Unix :fuente
#!/usr/bin/env pythonsí 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 pythongeneralmente 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 pythonidentificaría la instancia correcta de Python para virtualenv.fuente
whichle 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
whichseleccionará 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.pyEsto funcionará incluso si no tienes un declarador shebang.
Por qué el primero es más "portátil" es porque
/usr/bin/envcontiene suPATHdeclaració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épythondebe 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/envtoma la decisión correcta para ti.whichcomando: devolverá la cadena correcta para su sistema en particular.which pythonde nuevo y cambia la secuencia de comandos si los difiere de salida de la corriente tinglado