Was genau sollte in PYTHONPATH eingestellt werden?

71

Ich gehe durch und schreibe ein Setup-Dokument für andere Entwickler bei der Arbeit für ein Python-Projekt und habe die PYTHONPATHUmgebungsvariable nachgelesen. Ich schaue auf mein aktuelles Entwicklungssystem und denke, dass einige Dinge falsch eingestellt sind, die dazu führen, dass sich meine IDE (IntelliJ) beim Nachschlagen der Python-Bibliotheken falsch verhält.

Ich habe mir hier und hier die Dokumentation angesehen und bin mir immer noch nicht sicher, was eigentlich in der PYTHONPATHUmgebungsvariablen enthalten sein soll.

Ich habe PYTHONHOMEauf `C: \ Python27 'hingewiesen.

Mein Strom PYTHONPATHist auf eingestellt PYTHONHOME. Soll ich auch die Verzeichnisse aus hinzufügen sys.path?

AKTUALISIEREN:

Basierend auf den folgenden Informationen PYTHONPATHmuss nicht festgelegt werden, es sei denn, es gibt nicht standardmäßige Bibliotheken, die Python standardmäßig finden soll. Wenn ich zum Beispiel wxPython vom Installationsprogramm aus installiere, werden seine Bibliotheken hinzugefügt PYTHONPATH. Ich setze PYTHONHOMEdas Stammverzeichnis der Python-Installation, damit ich es meiner Systemumgebungsvariablen hinzufügen kann, PATHdamit ich Python von jedem Ort aus ausführen kann.

Casey
quelle

Antworten:

41

Sie müssen keinen von beiden einstellen. PYTHONPATH kann so eingestellt werden, dass es auf zusätzliche Verzeichnisse mit privaten Bibliotheken verweist. Wenn PYTHONHOME nicht festgelegt ist, verwendet Python standardmäßig das Verzeichnis, in dem python.exe gefunden wurde, sodass sich dir in PATH befinden sollte.

Mark Tolonen
quelle
3
PYTHONHOME verweist standardmäßig auf das Verzeichnis der Standardbibliothek (z. B. / usr / local / lib / pythonXX).
Ferdinand Beyer
2
@Ferdinand Nicht unter Windows. Es ist nicht eingestellt. Der Punkt ist jedoch, dass der Benutzer normalerweise nicht mit einem von beiden herumspielen muss, es sei denn, er hat ein privates Verzeichnis von Bibliotheken, das sich von den Standardeinstellungen unterscheidet.
Mark Tolonen
3
Natürlich ist es nicht gesetzt - Python setzt niemals Umgebungsvariablen. Es gibt jedoch ein internes Äquivalent zu PYTHONHOME, das mithilfe der Umgebungsvariablen überschrieben werden kann. Ich spreche über den Standardwert dieser internen Variablen.
Ferdinand Beyer
3
@ "Ferdinand Beyer" "Natürlich ist es nicht gesetzt - Python setzt niemals Umgebungsvariablen." Nun, zumindest das neueste Python 3.3 kann sich selbst zur PATH-Variablen hinzufügen. Bemerkenswert.
Twobob
23

Bei den meisten Installationen sollten Sie diese Variablen nicht festlegen, da sie für die Ausführung von Python nicht benötigt werden. Python weiß, wo sich die Standardbibliothek befindet.

Der einzige Grund, PYTHONPATH festzulegen, besteht darin, Verzeichnisse von benutzerdefinierten Python-Bibliotheken zu verwalten, die Sie nicht am globalen Standardspeicherort installieren möchten (z site-packages Verzeichnis) .

Stellen Sie sicher, dass Sie Folgendes lesen: http://docs.python.org/using/cmdline.html#environment-variables

Ferdinand Beyer
quelle
4
ok also solltest du nicht. Aber was solltest du tun?! Sie möchten Module im Pfad ausführen und möchten nicht, dass der Quellcode Pfade enthält (keine relativen und definitiv keine statischen Pfade).
Pashute
2

Folgendes habe ich gelernt: PYTHONPATH ist ein Verzeichnis, das dem Python-Importsuchpfad "sys.path" hinzugefügt werden kann, der aus dem aktuellen Verzeichnis besteht. CWD, PYTHONPATH, Standard- und Shared Library sowie Kundenbibliothek. Zum Beispiel:

% python3 -c "import sys;print(sys.path)"
['', 
'/home/username/Documents/DjangoTutorial/mySite', 
'/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', 
'/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages']

wobei der erste Pfad '' die aktuelle Richtung bezeichnet, ist der zweite Pfad via

%export PYTHONPATH=/home/username/Documents/DjangoTutorial/mySite 

Diese können zu ~ / .bashrc hinzugefügt werden, um sie dauerhaft zu machen. Der Rest sind Python-Standard- und dynamische gemeinsam genutzte Bibliotheken sowie Bibliotheken von Drittanbietern wie Django.

Wie gesagt, um sich nicht mit PYTHONHOME anzulegen, führt die Einstellung auf '' oder 'Keine' dazu, dass die Python3-Shell nicht mehr funktioniert:

% export PYTHONHOME=''
% python3
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'

Current thread 0x00007f18a44ff740 (most recent call first):
Aborted (core dumped)

Beachten Sie, dass beim Starten eines Python-Skripts das CWD das Verzeichnis des Skripts ist. Zum Beispiel:

username@bud:~/Documents/DjangoTutorial% python3 mySite/manage.py runserver
==== Printing sys.path ====
/home/username/Documents/DjangoTutorial/mySite # CWD is where manage.py resides
/usr/lib/python3.6
/usr/lib/python3.6/lib-dynload
/usr/local/lib/python3.6/dist-packages
/usr/lib/python3/dist-packages

Sie können zur Laufzeit auch einen Pfad an sys.path anhängen: Angenommen, Sie haben eine Datei Fibonacci.py im Verzeichnis ~ / Documents / Python:

username@bud:~/Documents/DjangoTutorial% python3 
>>> sys.path.append("/home/username/Documents")
>>> print(sys.path)
['', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', 
'/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages', 
'/home/username/Documents']
>>> from Python import Fibonacci as fibo

oder über

% PYTHONPATH=/home/username/Documents:$PYTHONPATH
% python3
>>> print(sys.path)
['', 
'/home/username/Documents', '/home/username/Documents/DjangoTutorial/mySite', 
'/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', 
'/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages']
>>> from Python import Fibonacci as fibo
Leon Chang
quelle