2009-08-30 12 views
63

Qualcuno lo sa? Non sono mai stato in grado di trovare una risposta.Perché "#!/Usr/bin/env python" è più corretto di "#!/Usr/bin/python"?

+4

non una tonnellata. sono su osx e la pagina di manuale di env è piuttosto ambigua lì. –

+16

@ S.Lott: l'hai * letto * ultimamente? Sulla mia scatola Debian, è una delle pagine man più inutili che abbia mai visto, e questo sta dicendo qualcosa. (Ecco l'intera "Descrizione": imposta ogni NOME su VALUE nell'ambiente ed esegui COMMAND. Sì, questo lo azzererebbe subito.) – Telemachus

+0

@Telemachus: Sì, l'ho letto. È per questo che ho trovato la voce di Wikipedia. –

risposta

64

Se siete inclini a l'installazione di pitone in varie e interessanti posti sul vostro cammino (come in $PATH in tipiche shell Unix, %PATH su quelli tipici di Windows), utilizzando /usr/bin/env soddisferà il vostro capriccio (beh, almeno in ambienti di tipo Unix) mentre si passa direttamente a /usr/bin/python no. Ma perdere il controllo della versione di Python in cui si eseguono gli script non è un vero affare ... se guardi il mio codice, è più probabile vederlo iniziare con, ad esempio, #!/usr/local/bin/python2.5 piuttosto che con un open e accettare #!/usr/bin/env python - assumendo lo script è importante mi piace assicurarmi che venga eseguito con la versione specifica che ho testato e sviluppato con, NON uno semi-casuale ;-).

+38

Ovviamente, puoi sempre usare #!/Usr/bin/env python2.5 per limitare il set di scelte semi-casuali: =) –

+1

+1 Ottima spiegazione, grazie! Non avevo mai visto quell'uso di "env" prima ... ora ho qualcosa da aggiungere al mio bagaglio di trucchi. –

+3

+1 per la giustificazione di NON utilizzare "env python". Mi ha fatto capire che se volessi usare "env python", sarebbe meglio che codifica per il minimo comune denominatore, dato che non avrei alcun controllo sulla versione di python che l'utente ha per primo nel PATH. –

5

Trova 'python' anche in/usr/local/bin, ~/bin,/opt/bin, ... o ovunque possa nascondersi.

+0

grazie! in realtà mi ha causato un problema perché, per qualche ragione, l'env non esisteva. –

+3

Questo è un po 'fuorviante. Troverai solo il primo "python" sulle tue attuali $ PATH e le istanze Python su OS X possono essere abbastanza buone da nascondere. In particolare, il framework standard si basa su python.org e altri hanno sottodirectory "bin" all'interno del framework dove sono memorizzati "python" e altri eseguibili e script. È molto facile finire con più istanze che potrebbero avere o non avere collegamenti simbolici nei soliti posti, come/usr/local/bin et al. Gestire $ PATH su OS X in questo caso non è così semplice come nei sistemi senza build in stile framework. –

+2

@KennethReitz: se '/ usr/bin/env' non esiste, il sistema è danneggiato. 'env'è uno strumento richiesto dallo standard POSIX. – MestreLion

24

Da wikipedia

SheBangs specificare percorsi assoluti agli eseguibili di sistema; questo può causare problemi sui sistemi che hanno layout di file system non standard

Spesso, il programma/usr/bin/env possono essere utilizzati per aggirare questo limitazione

10

trova l'eseguibile pitone nella vostra l'ambiente e lo usa è più portabile perché python potrebbe non essere sempre in/usr/bin/python. env si trova sempre in/usr/bin.

+0

env non è sempre lì, ma stiamo aumentando la probabilità che lo script trovi python su più macchine. :) – Will

Problemi correlati