Python-Skript-Header

79

Der typische Header sollte sein

#!/usr/bin/env python

Aber ich fand unten funktioniert auch beim Ausführen des Skripts wie $python ./my_script.py

#!/usr/bin/python
#!python

Was ist der Unterschied zwischen diesen beiden Headern? Was könnte das Problem für den 2. sein? Bitte besprechen Sie auch den Fall für Python-Interpreter in PATH oder nicht. Vielen Dank.

Stan
quelle
3
Dieser Header heißt Shebang en.wikipedia.org/wiki/Shebang_%28Unix%29
systempuntoout
4
Zu Ihrer Information: Wenn Sie ein Skript auf die Art $ python ./my_script.pyund Weise ausführen ( pythonexplizit angeben), wird die #!Zeile shebang ( ) ignoriert. Dies wirkt sich nur aus, wenn Sie das Skript als ausführbare Datei ausführen, z $ ./my_script.py.
David Z
@ David Zaslavsky: +1 Guter Fang.
Mark Byers

Antworten:

103

Erstens, jedes Mal, wenn Sie ein Skript explizit mit dem Interpreter ausführen, wie in

$ python ./my_script.py
$ ksh ~/bin/redouble.sh
$ lua5.1 /usr/local/bin/osbf3

Die #!Zeile wird immer ignoriert. Die #!Zeile ist eine Unix-Funktion nur für ausführbare Skripts und kann auf der Manpage fürexecve(2) vollständig dokumentiert werden . Dort finden Sie, dass das folgende Wort #!der Pfadname einer gültigen ausführbaren Datei sein muss. Damit

#!/usr/bin/env python

führt alles aus, was pythonsich auf den Benutzern befindet $PATH. Dieses Formular ist unempfindlich gegen das Verschieben des Python-Interpreters, wodurch es etwas portabler wird. Es bedeutet jedoch auch, dass der Benutzer den Standard-Python-Interpreter überschreiben kann, indem er etwas vor sich einfügt $PATH. Abhängig von Ihren Zielen kann dieses Verhalten in Ordnung sein oder auch nicht.

Nächster,

#!/usr/bin/python

befasst sich mit dem allgemeinen Fall, in dem ein Python-Interpreter installiert ist /usr/bin. Wenn es woanders installiert ist, verlieren Sie. Dies ist jedoch eine gute Möglichkeit, um sicherzustellen, dass Sie genau die gewünschte Version oder gar nichts erhalten ("Fail-Stop" -Verhalten), wie in

#!/usr/bin/python2.5

Schließlich,

#!python

funktioniert nur, wenn sich pythonim aktuellen Verzeichnis eine ausführbare Datei befindet, wenn das Skript ausgeführt wird. Nicht empfohlen.

Norman Ramsey
quelle
28


Ich würde am Anfang Ihres Skripts drei Dinge vorschlagen:

Erstens, wie bereits gesagt, verwenden Sie die Umgebung:

#!/usr/bin/env python

Zweitens stellen Sie Ihre Codierung ein:

# -*- coding: utf-8 -*-

Drittens setzen Sie eine Dokumentzeichenfolge:

"""This is a awesome
    python script!"""

Und sicher würde ich " "(4 Leerzeichen) für ident verwenden.
Der endgültige Header sieht folgendermaßen aus:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""This is a awesome
        python script!"""


Beste Wünsche und viel Spaß beim Codieren.

Dimitar Atanasov
quelle
Nur um den scheinbar einfühlsamen Kommentar zu Leerzeichen über Tabulatoren zu unterstützen: "Leerzeichen sind die bevorzugte Einrückungsmethode." ( python.org/dev/peps/pep-0008/#tabs-or-spaces )
deepelement
5

Die ausführbare Python-Datei wird möglicherweise an einem anderen Speicherort als / usr / bin installiert, envist jedoch fast immer an diesem Speicherort vorhanden, sodass die Verwendung /usr/bin/envportabler ist.

Mark Byers
quelle
2

Aus der Manpage für env(GNU coreutils 6.10):

env - run a program in a modified environment

Theoretisch können Sie envdie Umgebung zurücksetzen (viele der vorhandenen Umgebungsvariablen entfernen) oder zusätzliche Umgebungsvariablen in den Skriptheader einfügen. In der Praxis sind die beiden von Ihnen genannten Versionen identisch. (Obwohl andere haben einen guten Punkt erwähnt: Angabe pythonüber envkönnen Sie abstrakt festlegen , pythonohne den Weg zu kennen.)

Annika Backstrom
quelle
1

Ja, es gibt - Python ist möglicherweise nicht in /usr/bin, aber zum Beispiel in /usr/local/bin(BSD).

Bei der Verwendung von virtualenv kann es sogar so etwas sein ~/projects/env/bin/python

Almad
quelle
0

Das /usr/bin/env pythonwird sehr nützlich , wenn Ihre Skripte auf Umgebungseinstellungen hängen zum Beispiel mithilfe von Skripts , die sich verlassen python virtualenv. Jedes virtualenv verfügt über eine eigene Version der Python-Binärdatei, die zum Hinzufügen von in virtualenv installierten Paketen zum Python-Pfad erforderlich ist (ohne PYTHONPATH env zu berühren).

Da immer mehr Benutzer Virtualenv für die Python-Entwicklung verwenden, bevorzugen Sie die Verwendung, es /usr/bin/env pythonsei denn, Sie möchten nicht, dass Benutzer ihre benutzerdefinierte Python-Binärdatei verwenden.

Hinweis: Sie sollten auch verstehen, dass es potenzielle Sicherheitsprobleme gibt (in Mehrbenutzerumgebungen), wenn Sie Benutzer Ihre Skripte in ihren benutzerdefinierten Umgebungen ausführen lassen. Sie können einige Ideen aus bekommen hier .

Jatin Kumar
quelle