¿Alguien sabe esto? Nunca he podido encontrar una respuesta.¿Por qué es '#!/Usr/bin/env python' supuestamente más correcto que solo '#!/Usr/bin/python'?
Respuesta
Si usted es propenso a la instalación de pitón en diversas e interesantes lugares en su camino (como en $PATH
en conchas típicas de Unix, %PATH
en las típicas de Windows), usando /usr/bin/env
se acomodará a su capricho (bueno, en entornos de tipo Unix al menos) yendo directamente a /usr/bin/python
no. Pero perder el control sobre en qué versión de Python se ejecutan tus scripts no es una ganga pura ... si miras mi código, es más probable que comiences con, por ejemplo, #!/usr/local/bin/python2.5
en lugar de abrir y aceptar #!/usr/bin/env python
- asumiendo el guión es importante. Me gusta asegurarme de que se ejecute con la versión específica que he probado y desarrollado con, NO una semi-aleatoria ;-).
Por supuesto, siempre puede usar #!/Usr/bin/env python2.5 para restringir el conjunto de opciones semialeatorias: =) –
+1 ¡Gran explicación, gracias! No había encontrado el uso de "env" antes ... ahora tengo algo que agregar a mi bolsa de trucos de scripting. –
+1 para la justificación de NO usar "env python". Me hizo darme cuenta de que si quiero usar "env python", será mejor que esté codificando el mínimo común denominador, ya que no tendría control sobre la versión de python que el usuario tiene primero en el PATH. –
Encuentra 'python' también en/usr/local/bin, ~/bin,/opt/bin, ... o donde sea que se pueda ocultar.
gracias! en realidad me causó un problema porque, por alguna razón, env no existía. –
Eso es un poco engañoso. Solo encontrará la primera "python" en sus instancias actuales de $ PATH y Python en OS X y puede ser bastante bueno para ocultarse. En particular, el marco estándar se construye desde python.org y otros tienen subdirectorios "bin" dentro del marco donde se almacenan "python" y otros ejecutables y scripts. Es muy fácil terminar con varias instancias que pueden o no tener enlaces simbólicos con ellos en los lugares habituales, como/usr/local/bin et al. Administrar $ PATH en OS X en este caso no es tan sencillo como en sistemas sin compilaciones de estilo de marco. –
@KennethReitz: si '/ usr/bin/env' no existe, su sistema está roto. 'env' es una herramienta obligatoria según el estándar POSIX. – MestreLion
Usted puede encontrar este post a ser de su interés: http://mail.python.org/pipermail/python-list/2008-May/661514.html
Esto puede ser una mejor explicación: http://mail.python.org/pipermail/tutor/2007-June/054816.html
De wikipedia
Shebangs especificar rutas absolutas a ejecutables del sistema; esto puede causar problemas en sistemas que tienen diseños de sistema de archivos no estándar
A menudo, el programa/usr/bin/env se pueden utilizar para evitar este limitación
se encuentra el ejecutable de Python en su ambiente y lo usa. es más portátil porque python puede no estar siempre en/usr/bin/python. env siempre se encuentra en/usr/bin.
env no siempre está ahí, pero estamos aumentando la probabilidad de que el script encuentre python en más máquinas. :) – Will
- 1. ¿Por qué es más lento que contiene?
- 2. ¿Por qué Python dice que pow solo tiene 2 argumentos?
- 3. ¿Por qué la gente dice que Java es más escalable que Python?
- 4. Pase por referencia: ¿Cuál es más legible/correcto?
- 5. ¿Por qué el retorno anticipado es más lento que otro?
- 6. ¿Por qué Python es mucho más lento en Windows?
- 7. ¿Por qué `vapply` es más seguro que` sapply`?
- 8. ¿Por qué MSMQ es más rápido que WCF QueueService?
- 9. ¿Por qué no es la longitud de un segundo correcto?
- 10. ¿Por qué Request.QueryString es solo de lectura?
- 11. Sharding por ObjectID, ¿es el camino correcto?
- 12. ¿Por qué Oracle piensa que me falta un paréntesis correcto?
- 13. ¿Por qué \% (\) es más rápido que \ (\) en Vim?
- 14. ¿Por qué String.IsNullOrEmpty es más rápido que String.Length?
- 15. ¿Por qué es Select 1 más rápido que Select count (*)?
- 16. ¿Por qué "hg push" es mucho más grande que .hg?
- 17. Por qué Array.reverse_each es más rápido que Array.reverse.each
- 18. ¿Por qué DarkGray es más ligero que Gray?
- 19. ¿Por qué multiplicar es más barato que dividir?
- 20. ¿Por qué Octave es más lento que MATLAB?
- 21. ¿Por qué i = i + 1 es más rápido que i ++?
- 22. ¿Por qué el quicksort es más popular que radix-sort?
- 23. ¿Por qué es === más rápido que == en PHP?
- 24. Por qué <es más lento que> =
- 25. Por qué unir es más rápido que la concatenación normal
- 26. ¿Por qué JSON es más ligero que XML?
- 27. ¿Por qué file_get_contents es más rápido que memcache_get?
- 28. Diccionario vs Objeto: ¿qué es más eficiente y por qué?
- 29. ¿Por qué math.factorial es mucho más lento en Python 2.x que en 3.x?
- 30. ¿Por qué el bucle en range() en Python es más rápido que usar un bucle while?
no es una tonelada. Estoy en OSX y la página de env es bastante ambigua allí. –
@ S.Lott: ¿Lo * leyó * últimamente? En mi caja de Debian, es una de las páginas de manualidades más inútiles que he visto en mi vida, y eso es decir algo. (Aquí está toda la "Descripción": Establezca cada NOMBRE a VALOR en el entorno y ejecute COMANDO. Sí, lo borraría). – Telemachus
@Telemachus: Sí, lo leí. Es por eso que encontré la entrada de Wikipedia. –