Warum schreiben Leute den #! / Usr / bin / env Python Shebang in die erste Zeile eines Python-Skripts?
Es scheint mir, wie die Dateien ausgeführt werden, ohne dass die Linie.
Kommentar zu dem Problem
Die Antwort unten, die besagt, dass es nur eine Kommentar-Zeile. Das ist nicht immer der Fall. Ich habe ein "Hello, World!" CGI-Skript(.py), die nur ausgeführt wird, und anzeigen der Webseite mit
#!/usr/bin/env python
an der Spitze. möglich, Duplikat der What ist der Unterschied zwischen diesen beiden python shebangs
Sie kann laufen, aber nicht in der vorgesehenen Umgebung
Die ich besucht habe in diesem post so viele Male in den 7 Jahren, da ich manchmal vergessen, die env hashbang. Copy-pasta 🙂
InformationsquelleAutor der Frage john garcias | 2010-03-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie mehrere Versionen von Python installiert,
/usr/bin/env
wird sicherstellen, dass die interpreter verwendet, ist die erste Ihrer Umgebung$PATH
. Die alternative wäre zu fest etwas wie#!/usr/bin/python
; das ist ok, aber weniger flexibel.In Unix, eine ausführbare - Datei, die gemeint ist, um interpretiert werden können, zeigen, was Dolmetscher zur Nutzung durch einen
#!
am Anfang der ersten Zeile, gefolgt von dem interpreter (und alle flags, die es brauchen können).Wenn Sie reden über andere Plattformen, natürlich, die diese Regel nicht gilt (aber das "shebang-Zeile" nicht Schaden, und wird helfen, wenn Sie jemals kopieren Sie das Skript, um eine Plattform mit ein Unix-Basis, wie z.B. Linux, Mac, etc).
InformationsquelleAutor der Antwort Alex Martelli
Genannt wird shebang-Zeile. Als die Wikipedia-Eintrag erklärt:
Siehe auch die Unix-FAQ-Eintrag.
Sogar unter Windows, wo die shebang-Zeile nicht bestimmen, die-interpreter ausgeführt werden, können Sie pass-Optionen für den interpreter, indem Sie diese auf die shebang-Zeile. Ich finde es nützlich, zu halten, eine generische shebang-Zeile in ein-aus-Skripte (wie die, die ich Schreibe, wenn die Beantwortung von Fragen auf), SO dass ich schnell testen können Sie sowohl auf Windows-und ArchLinux.
Den env-Dienstprogramm ermöglicht Ihnen das aufrufen eines Befehls auf dem Weg:
InformationsquelleAutor der Antwort Sinan Ünür
Ausbau ein bisschen auf die anderen Antworten, hier ein kleines Beispiel, wie die Kommandozeilen-Skripte können in Schwierigkeiten geraten, Leichtfertige Verwendung von
/usr/bin/env
shebang-Zeilen:Json Modul nicht vorhanden ist Python 2.5.
Einen Weg, um Schutz vor dieser Art von problem ist die Verwendung der Version python-Befehl Namen, die in der Regel installiert mit die meisten Pythons:
Wenn Sie brauchen nur zu unterscheiden zwischen Python 2.x und Python 3.x, aktuelle Versionen von Python 3 auch eine
python3
name:InformationsquelleAutor der Antwort Ned Deily
Damit führen Sie das python-Skript, das wir benötigen, um der shell zu sagen, drei Dinge:
Den Kram
#!
führt (1.). Die shebang beginnt mit einem#
weil die#
Charakter ist ein Kommentar-marker in vielen scripting-Sprachen. Die Inhalte der shebang-Zeile werden daher automatisch vom interpreter ignoriert.Den
env
Befehl vollbringt (2.) und (3.). Zitat "grawity,"InformationsquelleAutor der Antwort Rose Perrone
Technisch in Python, dies ist nur eine Kommentarzeile.
Diese Zeile wird nur verwendet, wenn Sie das py-Skript von der shell aus (von der Kommandozeile). Dies ist bekannt als die "Kram!", und es ist verwendet in verschiedenen Situationen, nicht nur mit Python-scripts.
Hier, es weist die shell an, starten Sie eine bestimmte version von Python (kümmert sich um den rest der Datei.
InformationsquelleAutor der Antwort mjv
Vielleicht ist Ihre Frage in diesem Sinne:
Wenn Sie verwenden möchten:
$python myscript.py
Sie brauchen nicht, die Linie. Das system nennt python und dann python-interpreter wird die Ausführung des Skripts.
Aber wenn Sie verwenden möchten:
$./myscript.py
Aufruf direkt wie ein normales Programm oder bash-Skript, die Sie brauchen, schreiben Sie diese Zeile, um festzulegen, dass das system, welches Programm verwenden, um es auszuführen, (und auch machen es ausführbar mit
chmod 755
)InformationsquelleAutor der Antwort user3765197
Den wichtigsten Grund, dies zu tun ist, um das Skript portabel Betriebssystem-Umgebungen.
Beispielsweise unter mingw, python-Skripte verwenden :
und unter GNU/Linux-distribution, es ist entweder:
oder
und unter den besten kommerziellen Unix-sw/hw-system (OS/X), es ist:
oder auf FreeBSD:
Jedoch alle diese Unterschiede kann das Skript portabel auf alle mithilfe:
InformationsquelleAutor der Antwort Jonathan Cline IEEE
Die
exec
system call im Linux kernel versteht shebangs (#!
) nativWenn Sie auf der bash:
unter Linux, erfordert dies die
exec
system call mit dem vollständigen Pfad zusomething
.Dieser Zeile wird der kernel aufgerufen wird, auf die Datei übergeben, um
exec
: https://github.com/torvalds/linux/blob/v4.8/fs/binfmt_script.c#L25Dieser liest die ersten bytes der Datei und vergleicht diese mit
#!
.Wenn das wahr ist, dann wird der rest der Zeile wird analysiert von der Linux-kernel, das macht eine exec-Aufruf mit Pfad
/usr/bin/env python
und aktuellen Datei als erstes argument:und das funktioniert für jede scripting Sprache, die verwendet
#
als Kommentar-Zeichen.Und ja, man kann eine Endlosschleife mit:
und eine ausführbare Datei, die im
/a
#!
nur passiert, dass Sie für Menschen lesbar, aber das ist nicht erforderlich.Wenn die Datei gestartet, mit unterschiedlichen bytes, dann die
exec
system call verwenden würden, einen anderen handler. Die anderen wichtigsten built-in-handler ist für die ELF-executable-Dateien: https://github.com/torvalds/linux/blob/v4.8/fs/binfmt_elf.c#L1305, welche Prüfungen für die bytes7f 45 4c 46
(das geschieht auch für Menschen lesbar, für.ELF
). Dieser liest die ELF-Datei, legt es in den Speicher korrekt und startet einen neuen Prozess mit ihm. Siehe auch: Wie funktioniert der kernel erhalten eine ausführbare binary-Datei für linux?Schließlich können Sie fügen Sie Ihre eigenen shebang-Handler mit der
binfmt_misc
Mechanismus. Zum Beispiel können Sie einen benutzerdefinierten handler für.jar
Dateien: Ausführen einer JAR-Datei ohne direkten Aufruf von `java` Dieser Mechanismus noch unterstützt-Handler-Datei-Erweiterung.Ich glaube nicht, dass POSIX gibt shebangs jedoch: https://unix.stackexchange.com/a/346214/32558 , obwohl es keine Erwähnung in auf Begründung Abschnitte, und in der form "wenn ausführbare Skripte werden vom system unterstützt so etwas kann passieren".
InformationsquelleAutor der Antwort Ciro Santilli 包子露宪 六四事件 法轮功
Es Sinn macht, eine Sache zu betonen, dass die meisten verpasst haben, die vielleicht nicht sofort Verständnis. Wenn Sie
python
im terminal, die Sie normalerweise nicht bieten einen vollständigen Pfad. Stattdessen wird die ausführbare Datei ist bis sah inPATH
Umgebungsvariable. Im Gegenzug, wenn Sie ausführen möchten, ein Python-Programm direkt/path/to/app.py
muss man sagen, die shell, was die Dolmetscher zu verwenden (via hashbang, was die anderen Autoren erklären, oben).Hashbang erwartet vollständigen Pfad auf einen Dolmetscher. So führen Sie Ihre Python-Programm direkt haben Sie den vollen Pfad zum Python-binary, die schwankt erheblich, zumal ein Einsatz von virtualenv. Adresse Portabilität der trick mit
/usr/bin/env
verwendet wird. Letztere ist ursprünglich alter Umgebung im Ort und einen Befehl ausführen. Wann ist keine änderung vorgesehen, es führt den Befehl in der aktuellen Umgebung, die effektiv die Ergebnisse in der gleichenPATH
- lookup, die der trick funktioniert.Source von unix stackexchange
InformationsquelleAutor der Antwort saaj
Es ist empfohlen, vorgeschlagen in der Dokumentation:
vom http://docs.python.org/py3k/tutorial/interpreter.html#executable-python-scripts
InformationsquelleAutor der Antwort Grzegorz Wierzowiecki
Dies ist ein shell-Konvention, teilt der shell mit, welches Programm kann das Skript ausführen.
behebt einen Pfad zu dem Python-binary.
InformationsquelleAutor der Antwort Frank Krueger
Können Sie versuchen, dieses Problem mit virtualenv
Hier test.py
Erstellen von virtuellen Umgebungen
aktivieren der jeweiligen Umgebung überprüfen Sie dann die Unterschiede
InformationsquelleAutor der Antwort Sercan Ulucan
Wenn ja, dann vielleicht läufst du dem Python-Programm unter Windows? Windows nicht verwenden, line—stattdessen verwendet er die Datei-Namen-Erweiterung, um das Programm auszuführen im Zusammenhang mit der Dateiendung.
Jedoch im Jahr 2011, ein "Python launcher" entwickelt wurde, die (einigermaßen) imitiert das Linux-Verhalten für Windows. Diese ist jedoch nur zu der Auswahl der Python-interpreter ausgeführt wird — z.B. die Wahl zwischen Python 2 und Python 3 auf einem system, wo beide installiert sind. Der launcher wird Optional installiert, wie
py.exe
von Python-installation und kann im Zusammenhang mit.py
Dateien, so dass der launcher überprüfen, ob Linie und im Gegenzug starten die angegebene Python-interpreter version.InformationsquelleAutor der Antwort Craig McQueen
Wenn Sie Ihr Skript in einer virtuellen Umgebung, sagen
venv
, dann ausführenwhich python
während der Arbeit anvenv
zeigt den Pfad zu den Python-interpreter:~/Envs/venv/bin/python
Beachten Sie, dass die name der virtuellen Umgebung eingebettet ist Sie den Pfad zum Python-interpreter. Daher hardcoding dieser Pfad im Skript wird dazu führen, dass zwei Probleme:
Daher, zu ergänzen, zu Jonathan's Antwort, die ideale shebang ist
#!/usr/bin/env python
, nicht nur für die Portabilität über Betriebssysteme, sondern auch für Portabilität in virtuellen Umgebungen, wie gut!InformationsquelleAutor der Antwort Bruce Wayne
Es nur gibt, was Dolmetscher, die Sie verwenden möchten. Um dies zu verstehen, erstellen Sie eine Datei über den terminal-by-doing -
touch test.py
, dann geben Sie in dieser Datei die folgenden:und tun
chmod +x test.py
um Ihr Skript ausführbar. Nach diesem, wenn Sie./test.py
sollten Sie eine Fehlermeldung erhalten, sagen:weil Python ist3 nicht supprt der print operator.
Jetzt gehen Sie vor und ändern Sie die erste Zeile des Codes:
und es wird funktionieren, drucken
test
auf stdout, da python2 unterstützt der print-operator. So, jetzt haben Sie gelernt, wie Sie zwischen den Skript-interpreters.InformationsquelleAutor der Antwort Pavel
Unter Berücksichtigung der Portabilität Probleme zwischen
python2
undpython3
sollten Sie immer angeben, entweder version, es sei denn, dein Programm ist kompatibel mit beiden.Einige Distributionen
python
symlinked aufpython3
für eine Weile jetzt - verlassen Sie sich nicht aufpython
wirdpython2
.Dies wird betont durch PEP 394:
InformationsquelleAutor der Antwort Zulan
Er sagt der Dolmetscherin, welche version von python, um das Programm mit, wenn Sie mehrere Versionen von python.
InformationsquelleAutor der Antwort Katie T
Dies ist gemeint, wenn mehr historische Daten als eine "echte" Antwort.
Daran erinnern, dass wieder in den Tag, Sie hatte VIELE unix-ähnliche Systeme, deren Designer alle hatten Ihre eigene Idee von, wo man Sachen und manchmal nicht gehören Python, Perl, Bash, oder viele andere GNU - /Open-Source-Zeugs an alle.
War dies sogar richtig ist, der verschiedene Linux-Distributionen. Auf Linux-pre-FHS[1]-haben Sie vielleicht python in /usr/bin/oder /usr/local/bin/. Oder ist es vielleicht nicht installiert wurden, so dass Sie Ihr eigenes und legen Sie es in ~/bin
Solaris war das Schlimmste, das ich jemals gearbeitet, teilweise wie der übergang von der Berkeley-Unix-System V. könnten Sie am Ende mit dem Zeug in /usr/, /usr/local/, /usr/ucb /opt/etc. Dies könnte für einige wirklich lange Wege. Ich habe Erinnerungen an das Zeug aus Sunfreeware.com installieren Sie jedes Paket in einem eigenen Verzeichnis, aber ich kann mich nicht erinnern, wenn es symlinked die binaries in /usr/bin oder nicht.
Oh, und manchmal auch /usr/bin war auf einem NFS-server[2].
Also die
env
- Dienstprogramm wurde entwickelt, um dies zu umgehen.Dann könnte man schreiben
#!/bin/env interpreter
und solange der Weg war richtig, die Dinge hatten eine angemessenen chance. Natürlich angemessenen gemeint (für Python und Perl) , Sie hatte auch die entsprechenden Umgebungsvariablen. Für die bash/ksh/zsh es funktionierte einfach.Dies war wichtig, weil die Leute vorbei um shell-Skripte (wie perl und python) und wenn Sie einmal hart codiert /usr/bin/python auf Ihrem Red Hat Linux-workstation war es zu brechen, schlecht auf eine SGI...naja, Nein, ich glaube IRIX setzen python in der richtigen Stelle. Aber auf einer Sparc-station könnte es gar nicht laufen.
Ich vermisse meine sparc-station. Aber nicht viel. Ok, jetzt hast du mir trolling um auf E-Bay. Bastages.
[1] Datei-system-Hierarchie-Standard. https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
[2] ja, und manchmal Menschen immer noch tun Sachen wie, dass. Und Nein, ich nicht tragen entweder eine Rübe ODER eine Zwiebel an meinem Gürtel.
InformationsquelleAutor der Antwort Petro
Mehr knappe, unvollständige, aber dennoch hilfreiche Antwort: virtuelle Umgebung-Kompatibilität. Google virtualenv. Verwenden Sie es für die Produktion von code.
InformationsquelleAutor der Antwort adam
dies sagt dem script, wo ist das python-Verzeichnis !
InformationsquelleAutor der Antwort