Wie finde ich meinen Python-Pfad mithilfe von Python heraus?

350

Wie finde ich heraus, welche Verzeichnisse in der PYTHONPATHVariablen meines Systems in einem Python-Skript (oder der interaktiven Shell) aufgeführt sind?

Paul D. Waite
quelle
24
Ich bin nicht sicher, was Sie versuchen, aber wenn Sie wissen möchten, welche Ordner für die Suche nach importierten Modulen verwendet werden, sollten Sie sich nicht darauf verlassen PYTHONPATH. Verwenden Sie sys.pathdafür.
Vanuan
Durch einfaches Experiment fand ich, dass Vanuans Antwort unten (Drucken von sys.path) nur PYTHONPATH druckt. Dies funktioniert, nachdem wir den Wert mit add_path (new_path) geändert haben, das zu PYTHONPATH hinzugefügt wird.
Chan Kim
6
Der Titel dieses Beitrags und der Text stellen zwei verschiedene Fragen. sys.pathist "Eine Liste von Zeichenfolgen, die den Suchpfad für Module angeben" - docs.python.org/2/library/sys.html#sys.path . PYTHONPATH ist eine Umgebungsvariable, die diese Liste beeinflusst. Nach jeder vernünftigen Definition sys.pathist Ihr "Python-Pfad".
Spinkus
4
Vergiss nicht python -m site.
Andrew McKinlay

Antworten:

236

sys.pathkann Elemente enthalten, die nicht speziell in Ihrer PYTHONPATHUmgebungsvariablen enthalten sind. Verwenden Sie zum direkten Abfragen der Variablen Folgendes:

import os
try:
    user_paths = os.environ['PYTHONPATH'].split(os.pathsep)
except KeyError:
    user_paths = []
Mark Ransom
quelle
3
(oder allgemeiner ... split (os.sep)). Ich kann nicht herausfinden, warum du nicht die Liebe bekommst, Mark. Ihre Antwort ist technisch genauer als die Antwort von Paul D Waite auf seine Frage ????
mjv
5
os.sep ist falsch, siehe stackoverflow.com/questions/1499019/…
Mark Ransom
2
Und dieses Problem mit dem Trennzeichen ist wahrscheinlich der Grund, warum ich die Liebe nicht bekommen habe. Danke, dass du mich klargestellt hast.
Mark Ransom
11
Und wenn Sie einen KeyError erhalten, bedeutet dies, dass PYTHONPATH in meinem System nicht definiert ist? Ist das ein Problem? Danke
glarrain
9
@glarrin, richtig - KeyError bedeutet, dass PYTHONPATH nicht definiert ist. Dies ist kein Problem, da bereits Standardpfade eingerichtet sind sys.path.
Mark Ransom
600

Das möchten Sie wahrscheinlich auch:

import sys
print(sys.path)

Oder als Einzeiler vom Terminal:

python -c "import sys; print('\n'.join(sys.path))"

Vorsichtsmaßnahme : Wenn Sie mehrere Versionen von Python installiert haben, sollten Sie einen entsprechenden Befehl python2oder verwenden python3.

Vanuan
quelle
Gleich. Linux aaa.com 2.6.18-4-686-bigmem # 1 SMP Mi Jun 6 09:41:07 UTC 2007 i686 GNU / Linux ... Debian Sarge
Spechal
7
Dies ist die plattform- und umgebungsunabhängige Methode, um den Python-Pfad der aktuellen Laufzeit abzurufen.
Dmitry
13
Diese Antwort war für meine Situation viel hilfreicher als die akzeptierte Antwort. Ich weiß, was meine Umgebungsvariablen sind. Ich musste wissen, wo Python neben meiner Umgebungsvariablen zeigen wollte.
Vorticity
Für Python 3:python -c "import sys; print('\n'.join(sys.path))"
mirceamironenco
@mirceamironenco geändert
Vanuan
10

Die andere Antwort kann anscheinend nicht bearbeitet werden. Hat einen kleinen Fehler darin, dass es nur Windows ist. Die allgemeinere Lösung besteht darin, os.sep wie folgt zu verwenden:

sys.path kann Elemente enthalten, die nicht speziell in Ihrer PYTHONPATH-Umgebungsvariablen enthalten sind. Verwenden Sie zum direkten Abfragen der Variablen Folgendes:

import os
os.environ['PYTHONPATH'].split(os.pathsep)
Vitali
quelle
6
Für zukünftige Leser: os.sepGibt das Verzeichnistrennzeichen für das Betriebssystem zurück, z /. Das im Python-Pfad verwendete Trennzeichen ist unterschiedlich und wird von zurückgegeben, os.pathsepwie in der akzeptierten Antwort gezeigt.
Paul D. Waite
3

PYTHONPATH ist eine Umgebungsvariable, deren Wert eine Liste von Verzeichnissen ist. Einmal festgelegt, wird es von Python verwendet, um nach importierten Modulen zu suchen, zusammen mit anderen Standardmodulen. und Bibliotheksverzeichnisse von Drittanbietern, die in Pythons "sys.path" aufgeführt sind.

Wie alle anderen Umgebungsvariablen können Sie sie entweder in der Shell oder in ~ / .bashrc exportieren (siehe hier) . Sie können os.environ ['PYTHONPATH'] nach seinem Wert in Python abfragen, wie unten gezeigt:

$ python3 -c "import os, sys; print(os.environ['PYTHONPATH']); print(sys.path) if 'PYTHONPATH' in sorted(os.environ) else print('PYTHONPATH is not defined')"

IF in Shell definiert als

$ export PYTHONPATH=$HOME/Documents/DjangoTutorial/mysite

DANN Ergebnis =>

/home/Documents/DjangoTutorial/mysite
['', '/home/Documents/DjangoTutorial/mysite', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

ELSE Ergebnis =>

PYTHONPATH is not defined

Informationen zum Einstellen von PYTHONPATH auf mehrere Pfade finden Sie hier .

Beachten Sie, dass Sie einen Suchpfad zur Laufzeit über sys.path.insert (), del oder remove () hinzufügen oder löschen können, jedoch NICHT über os.environ []. Beispiel:

>>> os.environ['PYTHONPATH']="$HOME/Documents/DjangoTutorial/mysite"
>>> 'PYTHONPATH' in sorted(os.environ)
True
>>> sys.path // but Not there
['', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']

>>> sys.path.insert(0,os.environ['PYTHONPATH'])
>>> sys.path // It's there
['$HOME/Documents/DjangoTutorial/mysite', '', '/usr/local/lib/python37.zip', '/usr/local/lib/python3.7', '/usr/local/lib/python3.7/lib-dynload', '/usr/local/lib/python3.7/site-packages']
>>> 

Zusammenfassend ist PYTHONPATH eine Möglichkeit, die Python-Suchpfade für importierte Module in sys.path anzugeben. Sie können Listenoperationen auch ohne Hilfe von PYTHONPATH direkt auf sys.path anwenden.

Leon Chang
quelle
0

Python sagt mir, wo es lebt, wenn es mir eine Fehlermeldung gibt :)

>>> import os
>>> os.environ['PYTHONPATH'].split(os.pathsep)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\martin\AppData\Local\Programs\Python\Python36-32\lib\os.py", line 669, in __getitem__
    raise KeyError(key) from None
KeyError: 'PYTHONPATH'
>>>
C4rnot
quelle
-1

Benutze das:

import sys
print(sys.executable)

Oder eine Zeile vom cmd:

python -c "import sys; print(sys.executable)"
matan h
quelle
1
Es sieht so aus, als würde der Autor der Frage nach der Liste der Python-Verzeichnisse fragen, nicht nach dem Pfad zur eigentlichen ausführbaren Python-Datei.
Sergey Shubin