wake-up-neo.net

Soll ich # setzen! (Shebang) in Python Skripten, und welche Form sollte es annehmen?

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

#!/usr/bin/env python 

oder

#!/usr/local/bin/python

Sind diese gleichermaßen portabel? Welche Form wird am häufigsten verwendet?

Hinweis: Das Tornado Projekt verwendet den Shebang. Andererseits funktioniert das Django Projekt nicht.

701
treecoder

Die Shebang-Zeile in einem Skript legt fest, ob das Skript wie eine eigenständige ausführbare Datei ausgeführt werden kann, ohne zuvor im Terminal python einzugeben oder beim Doppelklicken in einem Dateimanager (bei ordnungsgemäßer Konfiguration). Es ist nicht notwendig, wird aber im Allgemeinen dort abgelegt. Wenn jemand sieht, wie die Datei in einem Editor geöffnet wird, weiß er sofort, wonach er sucht. Welche Shebang-Linie Sie jedoch verwenden IST wichtig.

Die korrekte Verwendung für Python 3-Skripte lautet:

#!/usr/bin/env python3

Dies ist standardmäßig die neueste Version. Verwenden Sie für Python 2.7.latest python2 anstelle von python3.

Das folgende sollte NICHT verwendet werden (mit Ausnahme des seltenen Falls, dass Sie Code schreiben, der mit Python 2.x kompatibel ist und 3.x):

#!/usr/bin/env python

Der Grund für diese Empfehlungen in PEP 394 ist, dass python auf verschiedenen Systemen entweder auf python2 oder python3 verweisen kann. Derzeit wird bei den meisten Distributionen auf python2 verwiesen, dies wird sich jedoch wahrscheinlich irgendwann ändern.

Verwenden Sie auch NICHT:

#!/usr/local/bin/python

"In diesen Fällen kann Python unter/usr/bin/python oder/bin/python installiert werden.

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

950
GlassGhost

Es ist wirklich nur Geschmackssache. Das Hinzufügen des Shebang bedeutet, dass die Benutzer das Skript direkt aufrufen können, wenn sie dies möchten (vorausgesetzt, es ist als ausführbar markiert). Wenn Sie es weglassen, muss python manuell aufgerufen werden.

Das Endergebnis der Ausführung des Programms ist in keiner Weise betroffen. Es sind nur Optionen der Mittel.

68
Amber

Soll ich den Shebang in meine Python Skripte einfügen?

Fügen Sie einen Shebang in ein Python Skript ein, um Folgendes anzugeben:

  • dieses Modul kann als Skript ausgeführt werden
  • ob es nur auf python2, python3 ausgeführt werden kann oder ob es Python 2/3 kompatibel ist
  • unter POSIX ist dies erforderlich, wenn Sie das Skript direkt ausführen möchten, ohne die ausführbare Datei python explizit aufzurufen

Sind diese gleichermaßen portabel? Welche Form wird am häufigsten verwendet?

Wenn Sie einen Shebang manuell schreiben, verwenden Sie immer #!/usr/bin/env python, es sei denn, Sie haben einen bestimmten Grund, ihn nicht zu verwenden. Dieses Formular wird auch unter Windows (Python-Launcher) verstanden.

Hinweis: installierte Skripte sollten eine bestimmte ausführbare python -Datei verwenden, z. B. /usr/bin/python oder /home/me/.virtualenvs/project/bin/python. Es ist schlecht, wenn ein Tool kaputt geht, wenn Sie eine virtuelle Umgebung in Ihrer Shell aktivieren. Glücklicherweise wird der richtige Shebang in den meisten Fällen automatisch von setuptools oder den Tools Ihres Distributionspakets erstellt (unter Windows kann setuptools Wrapper-Skripts .exe automatisch generieren).

Mit anderen Worten, wenn sich das Skript in einem Quellcode-Checkout befindet, wird wahrscheinlich #!/usr/bin/env python angezeigt. Wenn es installiert ist, ist der Shebang ein Pfad zu einer bestimmten ausführbaren python -Datei wie #!/usr/local/bin/python (HINWEIS: Sie sollten die Pfade aus der letzteren Kategorie nicht manuell schreiben).

Informationen darüber, ob Sie python, python2 oder python3 im Shebang verwenden sollen, finden Sie unter PEP 394 - Der "Python" -Befehl auf Unix-ähnlichen Systemen :

  • ... python sollte in der Shebang-Zeile nur für Skripte verwendet werden, die mit den Quellen Python 2 und 3 kompatibel sind.

  • in Vorbereitung auf eine eventuelle Änderung der Standardversion von Python sollten Python 2 nur Skripte entweder so aktualisiert werden, dass sie mit Python 3 kompatibel sind, oder dass python2 in verwendet wird die Shebang Linie.

25
jfs

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

#!/usr/bin/python2.7

Beachten Sie, dass das Skript weiterhin über eine vollständige Python - Befehlszeile oder über den Import ausgeführt werden kann. In diesem Fall wird der She-Bang ignoriert. Aber für Skripte, die direkt ausgeführt werden, ist dies ein guter Grund, den She-Bang zu verwenden.

#!/usr/bin/env python ist im Allgemeinen der bessere Ansatz, dies hilft jedoch in Sonderfällen.

Normalerweise ist es besser, eine virtuelle Umgebung Python einzurichten. In diesem Fall identifiziert der generische #!/usr/bin/env python die richtige Instanz von Python für die virtuelle Umgebung.

15
Chris Johnson

Sie sollten einen Shebang hinzufügen, wenn das Skript ausführbar sein soll. Sie sollten das Skript auch mit einer Installationssoftware installieren, die den Shebang so ändert, dass er auf der Zielplattform funktioniert. Beispiele hierfür sind distutils und Distribute.

10
Lennart Regebro

Der Zweck von Shebang besteht darin, dass das Skript den Interpretertyp erkennt, wenn Sie das Skript über die Shell ausführen möchten. Meistens und nicht immer führen Sie Skripts aus, indem Sie den Interpreter extern bereitstellen. Anwendungsbeispiel: python-x.x script.py

Dies funktioniert auch, wenn Sie keinen Shebang-Deklarator haben.

Der Grund, warum das erste Programm "portabler" ist, ist, dass /usr/bin/env Ihre PATH -Deklaration enthält, die alle Ziele berücksichtigt, an denen sich die ausführbaren Dateien Ihres Systems befinden.

HINWEIS: Tornado verwendet Shebangs nicht strikt und Django nicht strikt. Dies hängt davon ab, wie Sie die Hauptfunktion Ihrer Anwendung ausführen.

AUCH: Das variiert nicht mit Python.

9
meson10

Manchmal, wenn die Antwort nicht sehr klar ist (ich meine, Sie können sich nicht entscheiden, ob ja oder nein), spielt es keine große Rolle, und Sie können das Problem ignorieren, bis die Antwort ist klar ist.

Der einzige Zweck von #! ist das Starten des Skripts. Django lädt die Quellen selbst und verwendet sie. Es muss nie entschieden werden, welcher Interpreter verwendet werden soll. Auf diese Weise macht der #! hier eigentlich keinen Sinn.

Wenn es sich um ein Modul handelt und nicht als Skript verwendet werden kann, ist die Verwendung des #! im Allgemeinen nicht erforderlich. Andererseits enthält eine Modulquelle häufig if __== '__main__': ... mit zumindest einigen geringfügigen Tests der Funktionalität. Dann macht der #! wieder Sinn.

Ein guter Grund für die Verwendung von #! ist, wenn Sie die Skripte Python 2 und Python 3 verwenden - sie müssen von verschiedenen Versionen von Python interpretiert werden. Auf diese Weise müssen Sie sich merken, was python verwendet werden muss, wenn Sie das Skript manuell starten (ohne den darin enthaltenen #!). Wenn Sie eine Mischung solcher Skripte haben, ist es eine gute Idee, den #! im Inneren zu verwenden, sie ausführbar zu machen und sie als ausführbare Dateien zu starten (chmod ...).

Unter MS-Windows hatte der #! bis vor kurzem keinen Sinn. Python 3.3 führt einen Windows Python-Launcher (py.exe und pyw.exe) ein, der die #! -Zeile liest, die installierten Versionen von Python erkennt und das richtige oder verwendet explizit gewünschte Version von Python. Da die Erweiterung mit einem Programm verknüpft werden kann, können Sie unter Windows ein ähnliches Verhalten wie unter Unix-basierten Systemen mit dem Ausführungsflag erzielen.

8
pepr

Als ich Python 3.6.1 kürzlich unter Windows 7 installierte, installierte es auch den Python Launcher für Windows, der die Shebang-Linie handhaben soll. Ich stellte jedoch fest, dass der Starter Python dies nicht tat: Die Shebang-Zeile wurde ignoriert und Python 2.7.13 wurde immer verwendet (es sei denn, ich habe das Skript mit py -3 ausgeführt).

Um dies zu beheben, musste ich den Windows-Registrierungsschlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\Shell\open\command bearbeiten. Dies hatte immer noch den Wert

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

aus meiner früheren Python 2.7-Installation. Ich habe diesen Registrierungsschlüsselwert in geändert

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

und die Python Launcher Shebang-Zeilenverarbeitung funktionierte wie oben beschrieben.

3
ETalbot

Antwort: Nur wenn Sie vorhaben, es zu einem ausführbaren Befehlszeilenskript zu machen.

Hier ist die Prozedur:

Beginnen Sie mit der Überprüfung der richtigen Shebang-Zeichenfolge:

which python

Nehmen Sie die Ausgabe davon und fügen Sie sie (mit der Shebang #!) In die erste Zeile ein.

Auf meinem System reagiert es so:

$which python
/usr/bin/python

Also wird dein Shebang so aussehen:

#!/usr/bin/python

Nach dem Speichern läuft es weiter wie bisher, da python diese erste Zeile als Kommentar sieht.

python filename.py

Kopieren Sie den Befehl, um ihn zu einem Befehl zu machen, und löschen Sie die Erweiterung .py.

cp filename.py filename

Sagen Sie dem Dateisystem, dass dies ausführbar sein wird:

chmod +x filename

Zum Testen verwenden Sie:

./filename

Bewährte Methode ist, es irgendwo in $ PATH zu verschieben, sodass Sie nur den Dateinamen selbst eingeben müssen.

Sudo cp filename /usr/sbin

Auf diese Weise funktioniert es überall (ohne das ./ vor dem Dateinamen)

0
SDsolar