He notado esto en un par de lenguajes de script, pero en este ejemplo, estoy usando python. En muchos tutoriales, comenzarían con #!/usr/bin/python3
la primera línea. No entiendo por qué tenemos esto.
- ¿No debería saber el sistema operativo que es un script de Python (obviamente está instalado ya que usted está haciendo referencia a él)
- ¿Qué sucede si el usuario está usando un sistema operativo que no está basado en Unix?
- El idioma se instala en una carpeta diferente por cualquier motivo
- El usuario tiene una versión diferente. Especialmente cuando no es un número de versión completo (como Python3 vs Python32)
En todo caso, podría ver que esto rompe el script de Python debido a los motivos enumerados anteriormente.
Respuestas:
#!/usr/bin/python3
Es una línea shebang .Una línea shebang define dónde se encuentra el intérprete. En este caso, el
python3
intérprete se encuentra en/usr/bin/python3
. Un tinglado línea también podría ser unabash
,ruby
,perl
intérprete o cualesquiera otros lenguajes de script, por ejemplo:#!/bin/bash
.Sin la línea shebang, el sistema operativo no sabe que es un script de Python, incluso si configura el indicador de ejecución en el script y lo ejecuta de la misma manera
./script.py
. Para hacer que el script se ejecute de manera predeterminada en python3, invoque comopython3 script.py
o establezca la línea shebang.Puede usar
#!/usr/bin/env python3
para la portabilidad en diferentes sistemas en caso de que tengan el intérprete de idiomas instalado en diferentes ubicaciones.fuente
#! /usr/bin/env python3
, ¿ debería ser elegido#! /usr/bin/python3
?Eso se llama hash-bang. Si ejecuta el script desde el shell, inspeccionará la primera línea para determinar qué programa debe iniciarse para interpretar el script.
Un sistema operativo no basado en Unix utilizará sus propias reglas para descubrir cómo ejecutar el script. Windows, por ejemplo, usará la extensión de nombre de archivo y
#
hará que la primera línea sea tratada como un comentario.Si la ruta al ejecutable de Python es incorrecta, entonces, naturalmente, el script fallará. Es fácil crear enlaces al ejecutable real desde cualquier ubicación especificada por la convención estándar.
fuente
Esta línea ayuda a encontrar el ejecutable del programa que ejecutará el script. Esta notación shebang es bastante estándar en la mayoría de los lenguajes de secuencias de comandos (al menos como se usa en sistemas operativos adultos).
Un aspecto importante de esta línea es especificar qué intérprete se utilizará. En muchas distribuciones de Linux centradas en el desarrollo, por ejemplo, es normal tener varias versiones de python instaladas al mismo tiempo.
Python 2.xy Python 3 no son 100% compatibles, por lo que esta diferencia puede ser muy importante. Por lo tanto
#! /usr/bin/python
, y#! /usr/bin/python3
no son los mismos (como tampoco lo son exactamente lo mismo que#! /usr/bin/env python3
como se ha señalado en otra parte de esta página.fuente
Y esta línea es cómo .
Es ignorado
No se ejecutará y debe cambiarse para que apunte a la ubicación adecuada. O
env
debería ser utilizado.No se ejecutará y, probablemente, no se ejecutará con una versión diferente independientemente.
fuente
Para aclarar cómo funciona la línea shebang para Windows, desde el documento de Python 3.7 :
fuente
En realidad, la determinación de qué tipo de archivo es muy complicado, por lo que ahora el sistema operativo no puede saberlo. Puede hacer muchas suposiciones basadas en:
Pero la línea de comando no se molesta con todo eso, ya que se ejecuta en una capa limitada compatible con versiones anteriores, desde que esa tontería elegante no significaba nada. Si hace doble clic en él, un sistema operativo moderno puede resolverlo, pero si lo ejecuta desde un terminal, entonces no, porque el terminal no se preocupa por las API de escritura de archivos específicas de su sistema operativo.
En cuanto a los otros puntos. Es una conveniencia, es igualmente posible ejecutar
python3 path/to/your/script
Si su python no está en la ruta especificada, entonces no funcionará, pero tendemos a instalar cosas para hacer que cosas como esta funcionen, no al revés. En realidad, no importa si estás bajo * nix, depende de tu shell si consideras esta línea porque es una
shellcode
. Entonces, por ejemplo, puede ejecutarbash
Windows.En realidad, puede omitir esta línea por completo, solo significa que la persona que llama tendrá que especificar un intérprete. Tampoco coloque a sus intérpretes en ubicaciones no estándar e intente llamar a los scripts sin proporcionar un intérprete.
fuente