Propósito de #! / Usr / bin / python3

160

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/python3la 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.

KayleL
fuente
stackoverflow.com/questions/2429511/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
9
Llegué a esta pregunta solo para copiar la cadena shebang.
omerjerk

Respuestas:

260

#!/usr/bin/python3Es una línea shebang .

Una línea shebang define dónde se encuentra el intérprete. En este caso, el python3intérprete se encuentra en /usr/bin/python3. Un tinglado línea también podría ser una bash, ruby, perlinté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 como python3 script.pyo establezca la línea shebang.

Puede usar #!/usr/bin/env python3para la portabilidad en diferentes sistemas en caso de que tengan el intérprete de idiomas instalado en diferentes ubicaciones.

Jin
fuente
9
Entonces #! /usr/bin/env python3, ¿ debería ser elegido #! /usr/bin/python3?
winklerrr
44
@winklerrr Sí, se usa más ampliamente.
MerreM
20

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.

Mark Ransom
fuente
12

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/python3no son los mismos (como tampoco lo son exactamente lo mismo que #! /usr/bin/env python3como se ha señalado en otra parte de esta página.

zxq9
fuente
6
  1. Y esta línea es cómo .

  2. Es ignorado

  3. No se ejecutará y debe cambiarse para que apunte a la ubicación adecuada. O envdebería ser utilizado.

  4. No se ejecutará y, probablemente, no se ejecutará con una versión diferente independientemente.

Ignacio Vazquez-Abrams
fuente
3

Para aclarar cómo funciona la línea shebang para Windows, desde el documento de Python 3.7 :

  • Si la primera línea de un archivo de script comienza con # !, se conoce como una línea "shebang". Linux y otros sistemas operativos similares a Unix tienen soporte nativo para tales líneas y se usan comúnmente en dichos sistemas para indicar cómo se debe ejecutar un script.
  • Python Launcher para Windows permite utilizar las mismas funciones con scripts de Python en Windows
  • Para permitir que las líneas shebang en los scripts de Python sean portátiles entre Unix y Windows, el lanzador admite una serie de comandos 'virtuales' para especificar qué intérprete usar. Los comandos virtuales compatibles son:
    • / usr / bin / env python
      • La forma / usr / bin / env de la línea shebang tiene otra propiedad especial. Antes de buscar intérpretes de Python instalados, este formulario buscará en la RUTA ejecutable un ejecutable de Python. Esto corresponde al comportamiento del programa env de Unix, que realiza una búsqueda de RUTA.
    • / usr / bin / python
    • / usr / local / bin / python
    • pitón
tablero
fuente
2

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:

  • extensión
  • ITU
  • MÍMICA

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 ejecutar bashWindows.

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.

Awiebe
fuente