Qualcuno lo sa? Non sono mai stato in grado di trovare una risposta.Perché "#!/Usr/bin/env python" è più corretto di "#!/Usr/bin/python"?
risposta
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 ;-).
Ovviamente, puoi sempre usare #!/Usr/bin/env python2.5 per limitare il set di scelte semi-casuali: =) –
+1 Ottima spiegazione, grazie! Non avevo mai visto quell'uso di "env" prima ... ora ho qualcosa da aggiungere al mio bagaglio di trucchi. –
+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. –
Trova 'python' anche in/usr/local/bin, ~/bin,/opt/bin, ... o ovunque possa nascondersi.
grazie! in realtà mi ha causato un problema perché, per qualche ragione, l'env non esisteva. –
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. –
@KennethReitz: se '/ usr/bin/env' non esiste, il sistema è danneggiato. 'env'è uno strumento richiesto dallo standard POSIX. – MestreLion
Potete trovare questo post per essere di interesse: http://mail.python.org/pipermail/python-list/2008-May/661514.html
Questa può essere una spiegazione migliore: http://mail.python.org/pipermail/tutor/2007-June/054816.html
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
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.
env non è sempre lì, ma stiamo aumentando la probabilità che lo script trovi python su più macchine. :) – Will
- 1. Perché $ {0x0} è corretto?
- 2. Perché Python 3 è notevolmente più lento di Python 2?
- 3. Sequenziale o parallelo: qual è il modo corretto di leggere più file in python?
- 4. Perché questo modulo è corretto in C?
- 5. Perché la sottrazione è più veloce dell'aggiunta in Python?
- 6. Perché Python è molto più lento su Windows?
- 7. Python: È un modo corretto di ignorare __eq__ e __hash__?
- 8. È corretto riutilizzare le raccolte IEnumerable più di una volta?
- 9. SQL SELECT è più veloce se richiamato nell'ordine corretto?
- 10. Qual è il metodo corretto per stampare le eccezioni Python?
- 11. Perché mmap() è più veloce dell'IO sequenziale?
- 12. Perché il massimo è più lento di ordinare?
- 13. È corretto utilizzare React.render() più volte nel DOM?
- 14. Perché Object.keys è più veloce di hasOwnProperty?
- 15. Perché gets() è più pericoloso di scanf()?
- 16. Perché Crystal è più veloce di Ruby?
- 17. Perché file_get_contents è più veloce di memcache_get?
- 18. Perché HashMap è più veloce di HashSet?
- 19. Perché Octave è più lento di MATLAB?
- 20. Perché "vapply" è più sicuro di "sapply"?
- 21. Perché ToUpperInvariant() è più veloce di ToLowerInvariant()?
- 22. Perché <è più lento di> =
- 23. Perché emplace_back è più veloce di push_back?
- 24. Perché Array.reverse_each è più veloce di Array.reverse.each
- 25. Perché Any è più lento di Contiene?
- 26. Perché è .index più veloce di .all?
- 27. Perché String.IsNullOrEmpty è più veloce di String.Length?
- 28. Perché JSON è più leggero di XML?
- 29. Perché è interpretato (python | ruby)?
- 30. Perché di Python "ordinato()" più lento di "copiare, quindi .Sort()"
non una tonnellata. sono su osx e la pagina di manuale di env è piuttosto ambigua lì. –
@ 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
@Telemachus: Sì, l'ho letto. È per questo che ho trovato la voce di Wikipedia. –