1235 Stimmen

Sollte ich #! (shebang) in Python-Skripte einfügen und welche Form sollte es haben?

Sollte ich den Shebang in meine Python-Skripte einfügen? In welcher Form?

#!/usr/bin/env python 

o

#!/usr/local/bin/python

Sind diese auch tragbar? Welche Form wird am häufigsten verwendet?

Note : die Tornado Projekt verwendet den ganzen Kram. Auf der anderen Seite ist das Django Projekt nicht.

1666voto

GlassGhost Punkte 14832

Die Shebang-Zeile in einem Skript bestimmt, ob das Skript wie eine eigenständige ausführbare Datei ausgeführt werden kann, ohne dass die Eingabe von python vorher im Terminal oder beim Doppelklick in einem Dateimanager (wenn richtig konfiguriert). Es ist nicht notwendig, wird aber in der Regel dort platziert, damit jemand, der die Datei in einem Editor öffnet, sofort weiß, was er vor sich hat. Wie auch immer, welche Shebang-Zeile Sie verwenden ist wichtig.

Richtig Verwendung für (Standardwert ist die Version 3.latest) Python 3 Skripten ist:

#!/usr/bin/env python3

Richtig Verwendung für (Standardwert ist die Version 2.latest) Python 2 Skripten ist:

#!/usr/bin/env python2

Die folgenden devrait no verwendet werden (außer in dem seltenen Fall, dass Sie Code schreiben, der sowohl mit Python 2.x als auch 3.x kompatibel ist):

#!/usr/bin/env python

Der Grund für diese Empfehlungen, die in PEP 394 ist, dass python kann sich entweder auf python2 o python3 auf verschiedenen Systemen.

Verwenden Sie auch nicht:

#!/usr/local/bin/python

"python kann unter /usr/bin/python oder /bin/python installiert sein, in diesen in diesen Fällen wird das obige #! fehlschlagen."

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

99voto

Amber Punkte 473552

Das ist wirklich nur eine Frage des Geschmacks. Das Hinzufügen des Shebang bedeutet, dass die Leute das Skript direkt aufrufen können, wenn sie wollen (vorausgesetzt, es ist als ausführbar markiert); das Weglassen bedeutet einfach python muss manuell aufgerufen werden.

Das Endergebnis der Ausführung des Programms wird so oder so nicht beeinträchtigt; es geht nur um die Optionen der Mittel.

46voto

jfs Punkte 370717

Sollte ich den Shebang in meine Python-Skripte einfügen?

Fügen Sie ein Shebang in ein Python-Skript ein, um anzuzeigen:

  • dieses Modul kann als Skript ausgeführt werden
  • ob es nur auf python2, python3 ausgeführt werden kann oder ob es mit Python 2/3 kompatibel ist
  • unter POSIX ist notwendig, wenn Sie das Skript direkt ausführen wollen, ohne python explizit ausführbar

Sind diese auch tragbar? Welche Form wird am häufigsten verwendet?

Wenn Sie einen Paukenschlag schreiben manuell dann verwenden Sie immer #!/usr/bin/env python es sei denn, Sie haben einen besonderen Grund, es nicht zu verwenden. Diese Form wird auch unter Windows verstanden (Python-Startprogramm).

Note : installiert Skripte sollten ein bestimmtes Python-Executable verwenden, z.B., /usr/bin/python o /home/me/.virtualenvs/project/bin/python . Es ist schlimm, wenn ein Werkzeug kaputt geht, wenn Sie eine Virtualenv in Ihrer Shell aktivieren. Glücklicherweise wird der richtige Shebang in den meisten Fällen automatisch von setuptools oder die Paketwerkzeuge Ihrer Distribution (unter Windows, setuptools kann Wrapper erzeugen .exe Skripte automatisch).

Mit anderen Worten, wenn sich das Skript in einem Source-Checkout befindet, werden Sie wahrscheinlich Folgendes sehen #!/usr/bin/env python . Wenn es installiert ist, ist der Shebang ein Pfad zu einer bestimmten Python-Ausführungskomponente wie #!/usr/local/bin/python (HINWEIS: Sie sollten die Pfade der letztgenannten Kategorie nicht manuell eingeben).

Um zu entscheiden, ob Sie Folgendes verwenden sollten python , python2 , oder python3 im Ganzen, siehe PEP 394 - Der Befehl "python" auf Unix-ähnlichen Systemen :

  • ... python sollte in der shebang-Zeile nur für Skripte verwendet werden, die die sowohl mit Python 2 als auch 3 quellkompatibel sind.

  • in Vorbereitung auf eine eventuelle Änderung der Standardversion von Python, sollten Skripte, die nur Python 2 enthalten, entweder aktualisiert werden, damit sie kompatibel mit Python 3 zu sein oder aber python2 in der Shebang-Linie.

1 Stimmen

@JaySullivan kennen Sie den Unterschied zwischen einem Source-Checkout und installierten Skripten? Ich stehe hinter diesem Vorschlag. Es funktioniert gut.

3 Stimmen

@jfs: Nachdem ich meinen Kommentar noch einmal gelesen habe, sehe ich, dass ich es nicht geschafft habe, meinen Standpunkt deutlich zu machen. Was ich meinte, war, dass die meisten Leute "python2" oder "python3" verwenden wollen, nicht "python". Die Frage, ob die Auflösung über den vollständigen Pfad oder die Umgebungsvariable erfolgen soll, was technisch gesehen die Frage des Auftraggebers war, haben Sie beantwortet, und ich widerspreche Ihnen in diesem Punkt nicht.

0 Stimmen

@JaySullivan Ich stimme zu. Haben Sie das Zitat aus dem Pep in der Antwort gelesen. Es sagt das Gleiche.

21voto

Chris Johnson Punkte 18854

Wenn Sie mehr als eine Version von Python haben und das Skript unter einer bestimmten Version laufen muss, kann she-bang sicherstellen, dass die richtige Version verwendet wird, wenn das Skript z.B. direkt ausgeführt wird:

#!/usr/bin/python2.7

Beachten Sie, dass das Skript auch über eine vollständige Python-Befehlszeile oder über den Import ausgeführt werden kann, wobei das "she-bang" ignoriert wird. Aber für Skripte, die direkt ausgeführt werden, ist dies ein guter Grund, den she-bang zu verwenden.

#!/usr/bin/env python ist in der Regel der bessere Ansatz, aber dies hilft in besonderen Fällen.

Normalerweise wäre es besser, eine virtuelle Python-Umgebung einzurichten, in der die generische #!/usr/bin/env python würde die richtige Instanz von Python für die virtuelle Umgebung identifizieren.

1 Stimmen

Wird der Platz nicht dazu führen, dass sie ausfällt?

1 Stimmen

@RandomInsano, das glaube ich nicht. Leerzeichen scheinen ziemlich verbreitet zu sein, und es gibt viele Belege dafür, dass dies eine akzeptierte Verwendung ist. Ich denke jedoch, dass "no-space" wahrscheinlich die kanonischere Verwendung ist.

1 Stimmen

In diesem Fall haben Sie definitiv Recht. Habe gerade mit bash und tcsh getestet.

15voto

meson10 Punkte 1836

Der Zweck von shebang ist, dass das Skript den Interpretertyp erkennt, wenn Sie das Skript von der Shell aus ausführen wollen. Meistens, aber nicht immer, führt man Skripte aus, indem man den Interpreter von außen angibt. Beispiel für die Verwendung: python-x.x script.py

Das funktioniert auch, wenn Sie keinen Shebang-Dekarator haben.

Der Grund, warum die erste Variante "tragbarer" ist, liegt darin, /usr/bin/env enthält Ihre PATH Deklaration, die alle Ziele berücksichtigt, an denen sich die ausführbaren Dateien Ihres Systems befinden.

HINWEIS: Tornado verwendet nicht unbedingt Shebangs, und Django verwendet sie nicht unbedingt. Es kommt darauf an, wie Sie die Hauptfunktion Ihrer Anwendung ausführen.

ALSO: Sie variiert nicht mit Python.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X