1366 Stimmen

Warum schreibt man #!/usr/bin/env python in die erste Zeile eines Python-Skripts?

Ich sehe dies am Anfang der Python-Dateien:

  1. Für Python 2-Dateien

    #!/usr/bin/env python
  2. Für Python 3-Dateien

    #!/usr/bin/env python3

Ich habe den Eindruck, dass die Dateien auch ohne diese Zeile funktionieren.

6voto

Srini Punkte 1580

Wenn Sie Ihr Skript in einer virtuellen Umgebung ausführen, sagen wir venv und dann die Ausführung which python bei der Arbeit an venv wird der Pfad zum Python-Interpreter angezeigt:

~/Envs/venv/bin/python

Beachten Sie, dass die Name der virtuellen Umgebung ist eingebettet im Pfad zum Python-Interpreter. Wenn Sie diesen Pfad in Ihrem Skript fest kodieren, führt dies zu zwei Problemen:

  • Wenn Sie das Skript in ein Repository hochladen, sind Sie Erzwingen des gleichen Namens der virtuellen Umgebung für andere Benutzer . Dies ist der Fall, wenn sie das Problem zuerst erkennen.
  • Sie nicht in der Lage sein, das Skript in mehreren virtuellen Umgebungen auszuführen selbst wenn Sie alle erforderlichen Pakete in anderen virtuellen Umgebungen haben.

Daher ist zu ergänzen Jonathan Die ideale Lösung ist laut der Antwort von #!/usr/bin/env python nicht nur für die Portabilität zwischen verschiedenen Betriebssystemen, sondern auch für die Portabilität zwischen virtuellen Umgebungen!

4voto

Roshin Raphel Punkte 2478

Die Linie #!/bin/bash/python3 o #!/bin/bash/python gibt an, welcher Python-Compiler verwendet werden soll. Möglicherweise haben Sie mehrere Python-Versionen installiert. Zum Beispiel,
a.py :

#!/bin/bash/python3
print("Hello World")

ist ein Python3-Skript, und
b.py :

#!/bin/bash/python
print "Hello World"

ist ein Python 2.x Skript
Um diese Datei auszuführen ./a.py o ./b.py verwendet wird, müssen Sie den Dateien vorher Ausführungsrechte geben, sonst führt die Ausführung zu Permission denied Fehler.
Zur Erteilung der Vollstreckungserlaubnis,

chmod +x a.py

3voto

Zulan Punkte 21436

In Anbetracht der Probleme der Übertragbarkeit zwischen python2 y python3 sollten Sie immer eine der beiden Versionen angeben, es sei denn, Ihr Programm ist mit beiden kompatibel.

Einige Distributionen werden ausgeliefert python symverknüpft mit python3 seit einer Weile - verlassen Sie sich nicht auf python unter python2 .

Dies wird unterstrichen durch PEP 394 :

I den Python-Interpreter aufrufen muss, sollte nicht python angeben, sondern sondern entweder python2 oder python3 angeben (oder die spezifischeren python2.x und python3.x Versionen; siehe die Anmerkungen zur Migration ). Diese Unterscheidung sollte in Shebangs, bei Aufrufen aus einem Shell Skript, beim Aufruf über den system()-Aufruf oder beim Aufruf in einem beliebigen anderen Kontext.

3voto

Katie T Punkte 341

Sie teilt dem Interpreter mit, mit welcher Python-Version er das Programm ausführen soll, wenn Sie mehrere Python-Versionen haben.

2voto

Goblinhack Punkte 2483

Es erlaubt Ihnen, die ausführbare Datei auszuwählen, die Sie verwenden möchten; das ist sehr was sehr praktisch ist, wenn Sie vielleicht mehrere Python-Installationen haben und unterschiedliche Module haben und diese auswählen möchten. z.B.

#!/bin/sh
#
# Choose the python we need. Explanation:
# a) '''\' translates to \ in shell, and starts a python multi-line string
# b) "" strings are treated as string concat by python, shell ignores them
# c) "true" command ignores its arguments
# c) exit before the ending ''' so the shell reads no further
# d) reset set docstrings to ignore the multiline comment code
#
"true" '''\'
PREFERRED_PYTHON=/Library/Frameworks/Python.framework/Versions/2.7/bin/python
ALTERNATIVE_PYTHON=/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
FALLBACK_PYTHON=python3

if [ -x $PREFERRED_PYTHON ]; then
    echo Using preferred python $ALTERNATIVE_PYTHON
    exec $PREFERRED_PYTHON "$0" "$@"
elif [ -x $ALTERNATIVE_PYTHON ]; then
    echo Using alternative python $ALTERNATIVE_PYTHON
    exec $ALTERNATIVE_PYTHON "$0" "$@"
else
    echo Using fallback python $FALLBACK_PYTHON
    exec python3 "$0" "$@"
fi
exit 127
'''

__doc__ = """What this file does"""
print(__doc__)
import platform
print(platform.python_version())

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