Scopo di #! / Usr / bin / python3


160

L'ho notato in un paio di linguaggi di scripting, ma in questo esempio sto usando Python. In molti tutorial, inizierebbero con #!/usr/bin/python3la prima riga. Non capisco perché abbiamo questo.

  • Il sistema operativo non dovrebbe sapere che è uno script Python (ovviamente è installato dal momento che si sta facendo un riferimento ad esso)
  • Che cosa succede se l'utente utilizza un sistema operativo non basato su unix
  • La lingua è installata in una cartella diversa per qualsiasi motivo
  • L'utente ha una versione diversa. Soprattutto quando non è un numero di versione completo (come Python3 vs Python32)

Semmai, ho potuto vedere questo rompere lo script Python a causa dei motivi sopra elencati.



9
Vengo a questa domanda solo per copiare la stringa Shebang.
omerjerk,

Risposte:


260

#!/usr/bin/python3è una linea shebang .

Una linea shebang definisce dove si trova l'interprete. In questo caso, l' python3interprete si trova in /usr/bin/python3. Una faccenda linea potrebbe anche essere un bash, ruby, perlinterprete o altri linguaggi di scripting, ad esempio: #!/bin/bash.

Senza la riga shebang, il sistema operativo non sa che si tratta di uno script Python, anche se si imposta il flag di esecuzione sullo script e lo si esegue come ./script.py. Per far funzionare lo script di default in python3, invocalo come python3 script.pyo imposta la riga shebang.

È possibile utilizzare #!/usr/bin/env python3per la portabilità su diversi sistemi nel caso in cui abbiano l'interprete di lingue installato in posizioni diverse.


9
Quindi #! /usr/bin/env python3dovrebbe essere scelto oltre #! /usr/bin/python3?
winklerrr,

4
@winklerrr Sì, è più ampiamente utilizzato.
MerreM,

20

Si chiama hash-bang. Se esegui lo script dalla shell, ispezionerà la prima riga per capire quale programma dovrebbe essere avviato per interpretare lo script.

Un sistema operativo non basato su Unix utilizzerà le proprie regole per capire come eseguire lo script. Windows, ad esempio, utilizzerà l'estensione del nome file e #la prima riga verrà trattata come un commento.

Se il percorso dell'eseguibile Python è sbagliato, naturalmente lo script fallirà. È facile creare collegamenti all'eseguibile effettivo da qualsiasi posizione specificata dalla convenzione standard.


12

Questa riga aiuta a trovare il programma eseguibile che eseguirà lo script. Questa notazione shebang è abbastanza standard nella maggior parte dei linguaggi di scripting (almeno come usato nei sistemi operativi per adulti).

Un aspetto importante di questa riga è specificare quale interprete verrà utilizzato. Su molte distribuzioni Linux incentrate sullo sviluppo, ad esempio, è normale avere diverse versioni di Python installate contemporaneamente.

Python 2.xe Python 3 non sono compatibili al 100%, quindi questa differenza può essere molto importante. Quindi #! /usr/bin/pythone #! /usr/bin/python3non sono gli stessi (e non sono nemmeno gli stessi di #! /usr/bin/env python3quelli notati altrove in questa pagina.


6
  1. E questa linea è come .

  2. Viene ignorato.

  3. Non verrà eseguito e dovrebbe essere modificato per puntare alla posizione corretta. O envdovrebbe essere usato.

  4. Non verrà eseguito e probabilmente non verrà eseguito con una versione diversa a prescindere.


3

Per chiarire come funziona la linea shebang per Windows, dal documento 3.7 di Python :

  • Se la prima riga di un file di script inizia con #!, È nota come riga "shebang". Linux e altri sistemi operativi come Unix hanno il supporto nativo per tali linee e sono comunemente usati su tali sistemi per indicare come eseguire uno script.
  • Python Launcher per Windows consente di utilizzare le stesse funzionalità con gli script Python su Windows
  • Per consentire alle linee shebang negli script Python di essere portatili tra Unix e Windows, il programma di avvio supporta una serie di comandi "virtuali" per specificare quale interprete utilizzare. I comandi virtuali supportati sono:
    • / usr / bin / env python
      • La forma / usr / bin / env della linea shebang ha un'altra proprietà speciale. Prima di cercare interpreti Python installati, questo modulo cercherà un eseguibile Python nel PATH eseguibile. Ciò corrisponde al comportamento del programma Unix env, che esegue una ricerca PATH.
    • / Usr / bin / python
    • / Usr / local / bin / python
    • pitone

2

In realtà la determinazione di quale tipo di file un file è molto complicata, quindi ora il sistema operativo non può semplicemente sapere. Può fare molte ipotesi basate su -

  • estensione
  • UTI
  • MIMO

Ma la riga di comando non si preoccupa di tutto ciò, perché gira su un livello limitato compatibile con le versioni precedenti, da quando quell'immaginazione assurda non significava nulla. Se fai doppio clic su di esso, un sistema operativo moderno può capirlo - ma se lo esegui da un terminale, allora no, perché al terminale non interessano le tue API di digitazione specifiche di file del sistema operativo.

Per quanto riguarda gli altri punti. È una comodità, è similmente possibile eseguire

python3 path/to/your/script

Se il tuo Python non è nel percorso specificato, non funzionerà, ma tendiamo a installare cose per far funzionare cose come questa, non viceversa. In realtà non importa se sei sotto * nix, sta alla tua shell se considerare questa linea perché è a shellcode. Ad esempio, puoi eseguire bashWindows.

Puoi effettivamente omettere completamente questa linea, significa solo che il chiamante dovrà specificare un interprete. Inoltre, non collocare i tuoi interpreti in posizioni non standard e quindi provare a chiamare gli script senza fornire un interprete.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.