risposta-alla-domanda-sullo-sviluppo-web-bd.com

Dovrei mettere #! (Shebang) in script Python e quale forma dovrebbe assumere?

Dovrei inserire lo Shebang nei miei script Python? In quale forma?

#!/usr/bin/env python 

o

#!/usr/local/bin/python

Sono ugualmente portatili? Quale forma è maggiormente utilizzata?

Nota:il tornado progetto utilizza lo Shebang. D'altra parte il Django project no.

638
treecoder

La riga Shebang in qualsiasi script determina la capacità dello script di essere eseguita come un eseguibile standalone senza digitare python in anticipo nel terminale o quando si fa doppio clic su un file manager (se configurato correttamente). Non è necessario, ma generalmente messo lì così quando qualcuno vede il file aperto in un editor, immediatamente sa cosa sta guardando. Tuttavia, quale riga di Shebang usiÈimportante.

Correct usage per gli script Python 3 è:

#!/usr/bin/env python3

Per impostazione predefinita, la versione 3.latest. Per Python 2.7.latest usa python2 al posto di python3.

Il seguente NON dovrebbe essere usato (tranne nel caso raro che tu stia scrivendo un codice che è compatibile sia con Python 2.x sia con 3.x):

#!/usr/bin/env python

La ragione di questi consigli, fornita in PEP 394 , è che python può riferirsi a python2 o python3 su sistemi diversi. Attualmente si riferisce a python2 sulla maggior parte delle distribuzioni, ma è probabile che cambi a un certo punto.

Inoltre, NON usare:

#!/usr/local/bin/python

"python può essere installato in/usr/bin/python o/bin/python in questi casi, il # # di sopra fallirà."

- "#!/usr/bin/env python" vs "#!/usr/local/bin/python"

875
GlassGhost

È davvero solo una questione di gusti. Aggiungere lo Shebang significa che le persone possono invocare lo script direttamente se lo desiderano (assumendo che sia contrassegnato come eseguibile); omettendolo vuol dire che python deve essere invocato manualmente.

Il risultato finale dell'esecuzione del programma non è influenzato in alcun modo; sono solo opzioni dei mezzi.

67
Amber

Dovrei inserire lo Shebang nei miei script Python?

Metti uno Shebang in uno script Python per indicare:

  • questo modulo può essere eseguito come script
  • se può essere eseguito solo su python2, python3 o è compatibile con Python 2/3
  • su POSIX, è necessario se si desidera eseguire direttamente lo script senza richiamare esplicitamente l'eseguibile python

Sono ugualmente portatili? Quale forma è maggiormente utilizzata?

Se scrivi uno Shebang manualmente allora usa sempre #!/usr/bin/env python a meno che tu non abbia una ragione specifica per non usarlo. Questo modulo è compreso anche su Windows (Python launcher).

Nota: installed scripts dovrebbe usare un eseguibile python specifico ad es., /usr/bin/python o /home/me/.virtualenvs/project/bin/python. È brutto se qualche strumento si rompe se attivi una virtualenv nella Shell. Fortunatamente, lo shebang corretto viene creato automaticamente nella maggior parte dei casi da setuptools o dagli strumenti del pacchetto di distribuzione (su Windows, setuptools può generare automaticamente script .exe wrapper).

In altre parole, se lo script è in un checkout sorgente, probabilmente vedrai #!/usr/bin/env python. Se è installato, Shebang è un percorso verso uno specifico eseguibile python come #!/usr/local/bin/python (NOTA: non si dovrebbero scrivere manualmente i percorsi da quest'ultima categoria).

Per scegliere se utilizzare python, python2 o python3 nello Shebang, vedere PEP 394 - Il comando "python" su sistemi Unix-Like :

  • ... python dovrebbe essere usato nella riga Shebang solo per gli script che sono compatibili sorgente con entrambi Python 2 e 3.

  • in preparazione di un eventuale cambiamento nella versione predefinita di Python, solo gli script di Python 2 dovrebbero essere aggiornati per essere compatibili con Python 3, oppure usare python2 nella riga Shebang.

25
jfs

Se hai più di una versione di Python e lo script deve essere eseguito con una versione specifica, she-bang può garantire che venga usato quello giusto quando lo script viene eseguito direttamente, ad esempio:

#!/usr/bin/python2.7

Si noti che lo script può ancora essere eseguito tramite una riga di comando Python completa o tramite importazione, nel qual caso la she-bang viene ignorata. Ma per gli script eseguiti direttamente, questo è un buon motivo per usare la she-bang.

#!/usr/bin/env python è generalmente l'approccio migliore, ma questo aiuta con casi speciali.

Di solito sarebbe meglio stabilire un ambiente virtuale Python, nel qual caso il generico #!/usr/bin/env python identificerebbe l'istanza corretta di Python per virtualenv.

15
Chris Johnson

Dovresti aggiungere uno Shebang se lo script è destinato ad essere eseguibile. Dovresti anche installare lo script con un software di installazione che modifichi lo Shebang in qualcosa di corretto, in modo che funzioni sulla piattaforma di destinazione. Esempi di questo sono distutils e Distribute.

10
Lennart Regebro

Lo scopo di Shebang è che lo script riconosca il tipo di interprete quando si desidera eseguire lo script da Shell. Principalmente, e non sempre, esegui gli script fornendo l'interprete esternamente. Esempio di utilizzo: python-x.x script.py

Funzionerà anche se non hai un dichiaratore di Shebang.

Perché il primo è più "portatile" è perché, /usr/bin/env contiene la dichiarazione PATH che tiene conto di tutte le destinazioni in cui risiedono gli eseguibili di sistema.

NOTA: Tornado non usa rigorosamente gli shebang, e Django non lo fa rigorosamente. Varia a seconda di come stai eseguendo la funzione principale dell'applicazione.

INOLTRE: non varia con Python.

9
meson10

A volte, se la risposta non è molto chiara (intendo che non puoi decidere se si o no), allora non importa troppo e puoi ignorare il problema finché la risposta è clear.

L'unico scopo #! è il lancio dello script. Django carica le sorgenti da solo e le usa. Non ha mai bisogno di decidere quale interprete dovrebbe essere usato. In questo modo, il #! in realtà non ha senso qui.

In genere, se si tratta di un modulo e non può essere utilizzato come script, non è necessario utilizzare #!. D'altra parte, una fonte di modulo spesso contiene if __== '__main__': ... con almeno alcune prove banali della funzionalità. Quindi #! ha senso di nuovo.

Una buona ragione per usare #! è quando si usano sia gli script Python 2 che Python 3 - devono essere interpretati da diverse versioni di Python. In questo modo, devi ricordare che python deve essere usato quando si avvia lo script manualmente (senza il #! all'interno). Se hai una mistura di tali script, è una buona idea usare #! all'interno, renderli eseguibili e lanciarli come eseguibili (chmod ...).

Quando si utilizza MS-Windows, il #! non aveva senso fino a poco tempo fa. Python 3.3 introduce un Python Launcher di Windows (py.exe e pyw.exe) che legge la riga #!, rileva le versioni installate di Python e utilizza la versione corretta o esplicitamente richiesta di Python. Poiché l'estensione può essere associata a un programma, è possibile ottenere un comportamento simile in Windows come con il flag di esecuzione nei sistemi basati su Unix.

7
pepr

Quando ho installato Python 3.6.1 su Windows 7 di recente, ha anche installato Python Launcher per Windows, che dovrebbe gestire la linea Shebang. Tuttavia, ho scoperto che Python Launcher non lo ha fatto: la riga di Shebang è stata ignorata e Python 2.7.13 è sempre stato usato (a meno che non avessi eseguito lo script usando py -3).

Per risolvere questo problema, ho dovuto modificare la chiave di registro di Windows HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\Shell\open\command. Questo aveva ancora il valore

"C:\Python27\python.exe" "%1" %*

dalla mia precedente installazione di Python 2.7. Ho modificato questo valore chiave del Registro di sistema

"C:\Windows\py.exe" "%1" %*

e l'elaborazione della linea Shebang di Python Launcher ha funzionato come descritto sopra.

2
ETalbot

Risposta: solo se si prevede di renderlo uno script eseguibile da riga di comando.

Ecco la procedura:

Inizia verificando la corretta stringa di Shebang da utilizzare:

which python

Prendi l'output da quello e aggiungilo (con Shebang #!) Nella prima riga.

Sul mio sistema risponde in questo modo:

$which python
/usr/bin/python

Quindi il tuo Shebang avrà il seguente aspetto:

#!/usr/bin/python

Dopo il salvataggio, verrà comunque eseguito come prima, dal momento che Python vedrà quella prima riga come un commento.

python filename.py

Per renderlo un comando, copialo per eliminare l'estensione .py.

cp filename.py filename

Dì al file system che questo sarà eseguibile:

chmod +x filename

Per testarlo, usa:

./filename

La migliore pratica è quella di spostarlo da qualche parte nel tuo $ PATH, quindi tutto ciò che devi digitare è il nome del file stesso.

Sudo cp filename /usr/sbin

In questo modo funzionerà ovunque (senza ./ prima del nome file)

1
SDsolar