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 tragbar? Welches Formular wird am häufigsten verwendet?
Hinweis: Das Tornado- Projekt verwendet den Shebang. Auf der anderen Seitetutdas Django- Projekt dies nicht.
python
shell
python-3.x
shebang
Baumkodierer
quelle
quelle
#!/usr/bin/python
Vergleich mit der ersten Option? Ich sehe das in ziemlich vielen Beispielcodes. Bearbeiten: Vielleicht ist dies die Antwort .. stackoverflow.com/a/2429517/1156245Antworten:
Die Shebang-Zeile in einem Skript bestimmt die Fähigkeit des Skripts, wie eine eigenständige ausführbare Datei ausgeführt zu werden, ohne
python
vorher in das Terminal einzugeben oder wenn Sie in einem Dateimanager darauf doppelklicken (bei ordnungsgemäßer Konfiguration). Es ist nicht notwendig, wird aber im Allgemeinen dort abgelegt. Wenn jemand die Datei in einem Editor geöffnet sieht, weiß er sofort, was er gerade sieht. Was jedoch shebang Linie , die Sie verwenden IS wichtig.Die korrekte Verwendung für Python 3-Skripte lautet:
Dies ist standardmäßig Version 3.latest. Für Python 2.7. Neueste Verwendung
python2
anstelle vonpython3
.Folgendes sollte NICHT verwendet werden (außer in dem seltenen Fall, dass Sie Code schreiben, der sowohl mit Python 2.x als auch mit 3.x kompatibel ist):
Der Grund für diese Empfehlungen in PEP 394 ist, dass
python
sie sich entweder aufpython2
oderpython3
auf verschiedenen Systemen beziehen können. Es bezieht sich derzeit auf diepython2
meisten Distributionen, aber das wird sich wahrscheinlich irgendwann ändern.Verwenden Sie auch NICHT:
- "#! / usr / bin / env python" vs "#! / usr / local / bin / python"
quelle
/usr/bin
dann , wie Sie sicher sein können , dieenv
in gefunden werden/usr/bin
. Wenn Python an einem nicht standardmäßigen Ort installiert wird, bedeutet dies wahrscheinlich, dass Python nicht standardmäßig eingerichtet wird und das Skript daher schnell fehlschlagen sollte. Im Gegensatz zu Annahmen über die Eigenschaften des Python-Interpreters und der Hoffnung auf das Beste.env
wird immer in gefunden/usr/bin/
, und seine Aufgabe ist es, Bins (wie Python) mit zu findenPATH
. Unabhängig davon, wie Python installiert ist, wird der Pfad zu dieser Variablen hinzugefügt undenv
gefunden (andernfalls wird Python nicht installiert). Das ist die Aufgabe vonenv
, das ist der ganze Grund, warum es existiert. Dies ist die Sache, die die Umgebung alarmiert (Env-Variablen einrichten, einschließlich der Installationspfade und Include-Pfade). Die Leute haben immer verstanden, dass dieser Befehl nur funktionieren kann, wenn er immer an derselben Stelle gefunden wird. Das ist nur eine/usr/bin/env
wird durch keinen anderen Standard als eine weit verbreitete (allgemein?) Angenommene Regel garantiert ...python
ausführbare Datei nur verwenden, wenn das Skript mit Python 2 und Python 3 kompatibel ist. Andernfalls sollte es auf die entsprechende Auswahl vonpython2
und verweisenpython3
.Es ist wirklich nur eine Frage des Geschmacks. Durch Hinzufügen des Shebang können Benutzer das Skript direkt aufrufen, wenn sie möchten (vorausgesetzt, es ist als ausführbar markiert). Wenn Sie es weglassen, muss es nur
python
manuell aufgerufen werden.Das Endergebnis der Programmausführung wird in keiner Weise beeinflusst. es sind nur Optionen der Mittel.
quelle
chmod a+x [your-script].py
sollte es ausführbar machen und dann können Sie einfach die./[your-script.py]
Shell aufrufen .Fügen Sie einen Shebang in ein Python-Skript ein, um Folgendes anzuzeigen:
python
ausführen möchten, ohne die ausführbare Datei explizit aufzurufenWenn Sie einen Shebang manuell schreiben, verwenden
#!/usr/bin/env python
Sie ihn immer, es sei denn, Sie haben einen bestimmten Grund, ihn nicht zu verwenden. Dieses Formular wird auch unter Windows (Python Launcher) verstanden.Hinweis: installierte Skripte sollte eine bestimmte Python ausführbare zB verwenden,
/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 vonsetuptools
oder Ihren Distributionspaket-Tools erstellt (unter Windowssetuptools
können Wrapper-.exe
Skripte automatisch generiert werden).Mit anderen Worten, wenn sich das Skript in einer Quellkasse befindet, werden Sie wahrscheinlich sehen
#!/usr/bin/env python
. 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).Zu entscheiden , ob Sie verwenden sollen
python
,python2
oderpython3
in dem shebang finden PEP 394 - Der „Python“ Befehl auf Unix-ähnliche Systemen :quelle
#!/usr/bin/env python
sich?#!/usr/bin/env python
. Bitte schlagen Sie nicht vor, "immer zu verwenden"#!/usr/bin/env python
. Dies ist in 99% der Fälle falsch (der Grund, den Sie in Ihre Antwort aufgenommen haben).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, zum Beispiel:
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 in der Regel der bessere Ansatz, aber dies hilft in besonderen Fällen.Normalerweise ist es besser, eine virtuelle Python-Umgebung
#!/usr/bin/env python
einzurichten. In diesem Fall identifiziert das Generikum die richtige Python-Instanz für die virtuelle Umgebung .quelle
which
geben Ihnen eine Zeichenfolge, die funktioniert, Punkt. Sie müssen sich keine Sorgen machen, um es zu benutzen.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.
quelle
which
automatisch die Standardeinstellung ausgewählt, die von Systembefehlen und dergleichen verwendet wird. Es ist generisch und das System steuert es zur richtigen Installation.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 Skripte aus, indem Sie den Interpreter extern bereitstellen. Anwendungsbeispiel:
python-x.x script.py
Dies funktioniert auch dann, wenn Sie keinen Shebang-Deklarator haben.
Der erste Grund ist, dass "portabler" ist, weil er
/usr/bin/env
IhrePATH
Deklaration enthält, die alle Ziele berücksichtigt, an denen sich die ausführbaren Dateien Ihres Systems befinden.HINWEIS: Tornado verwendet Shebangs nicht ausschließlich und Django nicht. Dies hängt davon ab, wie Sie die Hauptfunktion Ihrer Anwendung ausführen.
AUCH: Es variiert nicht mit Python.
quelle
Manchmal, wenn die Antwort ist nicht ganz klar (ich meine Sie nicht entscheiden können , ob ja oder nein), dann spielt es keine Rolle , zu viel, und man kann das Problem ignorieren , bis die Antwort ist klar.
Der
#!
einzige Zweck 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 das hier eigentlich keinen Sinn.Wenn es sich um ein Modul handelt, das nicht als Skript verwendet werden kann, muss das im Allgemeinen nicht verwendet werden
#!
. Andererseits enthält eine Modulquelle häufigif __name__ == '__main__': ...
zumindest einige triviale Tests der Funktionalität. Dann#!
macht das wieder Sinn.Ein guter Grund für die Verwendung
#!
ist, wenn Sie sowohl Python 2- als auch Python 3-Skripte verwenden - diese müssen von verschiedenen Versionen von Python interpretiert werden. Auf diese Weise müssen Sie sich merken, waspython
beim manuellen Starten des Skripts (ohne das#!
Innere) verwendet werden muss. Wenn Sie eine Mischung solcher Skripte haben, ist es eine gute Idee, das#!
Innere zu verwenden, sie ausführbar zu machen und sie als ausführbare Dateien zu starten (chmod ...).Bei der Verwendung von MS-Windows hatte das
#!
keinen Sinn - bis vor kurzem. 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 die richtige oder explizit gewünschte Version von Python verwendet. Da die Erweiterung einem Programm zugeordnet werden kann, können Sie unter Windows ein ähnliches Verhalten wie mit dem Ausführungsflag in Unix-basierten Systemen erzielen.quelle
Als ich kürzlich Python 3.6.1 unter Windows 7 installiert habe, wurde auch der Python Launcher für Windows installiert, der die Shebang-Zeile verarbeiten soll. Ich stellte jedoch fest, dass der Python Launcher 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 bearbeiten
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\shell\open\command
. Dies hatte immer noch den Wertvon meiner früheren Python 2.7-Installation. Ich habe diesen Registrierungsschlüsselwert in geändert
und die Python Launcher Shebang-Linienverarbeitung funktionierte wie oben beschrieben.
quelle
Wenn Sie verschiedene Module installiert haben und eine bestimmte Python-Installation verwenden müssen, scheint shebang zunächst eingeschränkt zu sein. Sie können jedoch Tricks wie die folgenden ausführen, damit der Shebang zuerst als Shell-Skript aufgerufen und dann Python ausgewählt werden kann. Das ist sehr flexibel imo:
Oder noch besser, um die Wiederverwendung von Code über mehrere Python-Skripte hinweg zu erleichtern:
und dann select.sh hat:
quelle
Antwort: Nur wenn Sie vorhaben, daraus ein ausführbares Befehlszeilenskript zu machen.
Hier ist die Vorgehensweise:
Überprüfen Sie zunächst die richtige Shebang-Zeichenfolge:
Nehmen Sie die Ausgabe davon und fügen Sie sie (mit der shebang #!) In die erste Zeile ein.
Auf meinem System reagiert es wie folgt:
Ihr Schebang wird also so aussehen:
Nach dem Speichern wird es weiterhin wie zuvor ausgeführt, da Python diese erste Zeile als Kommentar sieht.
Um daraus einen Befehl zu machen, kopieren Sie ihn, um die Erweiterung .py zu löschen.
Teilen Sie dem Dateisystem mit, dass dies ausführbar sein wird:
Verwenden Sie zum Testen Folgendes:
Die beste Vorgehensweise besteht darin, es irgendwo in Ihrem $ PATH zu verschieben, sodass Sie nur den Dateinamen selbst eingeben müssen.
Auf diese Weise funktioniert es überall (ohne das ./ vor dem Dateinamen)
quelle
Absoluter vs logischer Pfad:
Dies ist wirklich eine Frage, ob der Pfad zum Python-Interpreter in Bezug auf die Portabilität absolut oder logisch (
/usr/bin/env
) sein sollte.Als ich auf dieser und anderen Stack-Sites auf andere Antworten stieß, die allgemein über das Problem sprachen, ohne Beweise zu unterstützen, habe ich auf unix.stackexchange.com einige wirklich WIRKLICH granulare Tests und Analysen zu dieser Frage durchgeführt . Anstatt diese Antwort hier einzufügen, werde ich diejenigen, die an der vergleichenden Analyse interessiert sind, auf diese Antwort verweisen:
https://unix.stackexchange.com/a/566019/334294
Als Linux-Ingenieur ist es immer mein Ziel, meinen Entwickler-Clients die am besten geeigneten, optimierten Hosts bereitzustellen. Daher war das Problem der Python-Umgebungen etwas, auf das ich wirklich eine solide Antwort brauchte. Nach dem Testen war ich der Ansicht, dass der logische Pfad im She-Bang die bessere der (2) Optionen war.
quelle
Zuerst verwenden
Dies gibt die Ausgabe als den Ort an, an dem mein Python-Interpreter (binär) vorhanden ist.
Diese Ausgabe kann eine beliebige sein
oder
Wählen Sie nun die Shebang-Linie entsprechend aus und verwenden Sie sie.
Zur Verallgemeinerung können wir verwenden:
oder
quelle
#!/usr/bin/env
trifft die richtige Wahl für Sie.which
Befehl - er gibt die richtige Zeichenfolge für Ihr bestimmtes System zurück.which python
erneut aus und ändern das Skript, wenn die Ausgabe vom aktuellen Shebang abweicht