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.
$ python ./my_script.py
und Weise ausführen (python
explizit 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
.Antworten:
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
python
sich 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
python
im aktuellen Verzeichnis eine ausführbare Datei befindet, wenn das Skript ausgeführt wird. Nicht empfohlen.quelle
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.
quelle
Die ausführbare Python-Datei wird möglicherweise an einem anderen Speicherort als / usr / bin installiert,
env
ist jedoch fast immer an diesem Speicherort vorhanden, sodass die Verwendung/usr/bin/env
portabler ist.quelle
Aus der Manpage für
env
(GNU coreutils 6.10):env - run a program in a modified environment
Theoretisch können Sie
env
die 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: Angabepython
überenv
können Sie abstrakt festlegen ,python
ohne den Weg zu kennen.)quelle
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
quelle
Das
/usr/bin/env python
wird sehr nützlich , wenn Ihre Skripte auf Umgebungseinstellungen hängen zum Beispiel mithilfe von Skripts , die sich verlassenpython 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 python
sei 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 .
quelle