Jak znaleźć swoją ścieżkę do Pythona za pomocą Pythona?

350

Jak dowiedzieć się, które katalogi są wymienione w PYTHONPATHzmiennej mojego systemu , w skrypcie Python (lub w interaktywnej powłoce)?

Paul D. Waite
źródło
24
Nie jestem pewien, co próbujesz zrobić, ale jeśli chcesz wiedzieć, które foldery służą do wyszukiwania importowanych modułów, nie powinieneś polegać PYTHONPATH. Użyj sys.pathdo tego.
Vanuan
Po prostym eksperymencie znalazłem poniżej odpowiedź Vanuana (drukowanie sys.path), po prostu drukuje PYTHONPATH. Działa to po zmianie wartości za pomocą add_path (new_path), który dodaje do PYTHONPATH.
Chan Kim
6
Tytuł tego posta i treść zadają dwa różne pytania. sys.pathto „Lista ciągów znaków określających ścieżkę wyszukiwania modułów” - docs.python.org/2/library/sys.html#sys.path . PYTHONPATH to zmienna środowiskowa, która wpływa na tę listę. Z jakiejkolwiek rozsądnej definicji sys.pathjest twoja „ścieżka pythona”.
spinkus
4
Nie zapomnij o python -m site.
Andrew McKinlay,

Odpowiedzi:

236

sys.pathmogą zawierać elementy, które nie są specjalnie w PYTHONPATHzmiennej środowiskowej. Aby bezpośrednio wysłać zapytanie do zmiennej, użyj:

import os
try:
    user_paths = os.environ['PYTHONPATH'].split(os.pathsep)
except KeyError:
    user_paths = []
Mark Ransom
źródło
3
(lub, bardziej ogólnie ... podzielone (os.sep)). Nie mogę zrozumieć, dlaczego nie dostajesz miłości, Mark. Twoja odpowiedź jest technicznie dokładniejsza niż własna odpowiedź Paula D. Waite'a na jego pytanie ????
mjv
5
os.sep jest niepoprawny, patrz stackoverflow.com/questions/1499019/...
Mark Ransom
2
I ten problem z separatorem jest prawdopodobnie przyczyną, dla której nie dostałem miłości. Dzięki, że mnie wyprostowałeś.
Mark Ransom
11
A jeśli otrzymam KeyError, czy to oznacza, że ​​PYTHONPATH nie jest zdefiniowany w moim systemie? Czy to problem? Dzięki
glarrain
9
@glarrin, poprawne - KeyError oznacza, że ​​PYTHONPATH nie jest zdefiniowany. To nie będzie problem, ponieważ istnieją już ustawione ścieżki domyślne, zobacz sys.path.
Mark Ransom,
600

Prawdopodobnie chciałbyś również:

import sys
print(sys.path)

Lub jako jedna linijka z terminala:

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

Uwaga : Jeśli masz wiele wersji Pythona, powinieneś użyć odpowiedniej komendy python2lub python3.

Vanuan
źródło
Podobnie. Linux aaa.com 2.6.18-4-686-bigmem # 1 SMP Środa 6 czerwca 09:41:07 UTC 2007 i686 GNU / Linux ... Debian Sarge
Spechal
7
Jest to niezależny od platformy i środowiska sposób uzyskania bieżącej ścieżki python w środowisku wykonawczym.
Dmitry Minkovsky
13
Ta odpowiedź była o wiele bardziej pomocna w mojej sytuacji niż odpowiedź zaakceptowana. Wiem, jakie są moje zmienne środowiskowe. Musiałem wiedzieć, gdzie python postanowił wskazać oprócz mojej zmiennej środowiskowej.
Vorticity
Dla Python 3:python -c "import sys; print('\n'.join(sys.path))"
mirceamironenco
@mirceamironenco zmienił się
Vanuan
10

Nie można edytować drugiej odpowiedzi. Ma niewielki błąd, ponieważ jest to tylko system Windows. Bardziej ogólnym rozwiązaniem jest użycie os.sep jak poniżej:

sys.path może zawierać elementy, które nie są specjalnie w zmiennej środowiskowej PYTHONPATH. Aby bezpośrednio wysłać zapytanie do zmiennej, użyj:

import os
os.environ['PYTHONPATH'].split(os.pathsep)
Vitali
źródło
6
Dla przyszłych czytelników: os.sepzwraca separator katalogów dla systemu operacyjnego, np /. Separator użyty w ścieżce Pythona jest inny i jest zwracany przez, os.pathsepjak pokazano w zaakceptowanej odpowiedzi.
Paul D. Waite
3

PYTHONPATH to zmienna środowiskowa, której wartością jest lista katalogów. Raz ustawiony, jest używany przez Python do wyszukiwania importowanych modułów, wraz z innymi standardowymi. oraz katalogi bibliotek innych firm wymienione w „sys.path” Pythona.

Jak każda inna zmienna środowiskowa, możesz ją wyeksportować w powłoce lub w ~ / .bashrc, patrz tutaj . Możesz zapytać os.environ ['PYTHONPATH'] o jego wartość w Pythonie, jak pokazano poniżej:

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

JEŻELI zdefiniowano w powłoce jako

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

TO wynik =>

/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']

Wynik ELSE =>

PYTHONPATH is not defined

Aby ustawić PYTHONPATH na wiele ścieżek, zobacz tutaj .

Zauważ, że ścieżkę wyszukiwania można dodać lub usunąć za pomocą sys.path.insert (), del lub remove () w czasie wykonywania, ale NIE poprzez os.environ []. Przykład:

>>> 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']
>>> 

Podsumowując, PYTHONPATH to jeden ze sposobów określania ścieżek wyszukiwania w Pythonie dla importowanych modułów w sys.path. Możesz również zastosować operacje na liście bezpośrednio do sys.path bez pomocy PYTHONPATH.

Leon Chang
źródło
0

Python mówi mi, gdzie mieszka, gdy wyświetla komunikat o błędzie :)

>>> 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
źródło
-1

Użyj tego:

import sys
print(sys.executable)

Lub jedna linia z cmd:

python -c "import sys; print(sys.executable)"
matan h
źródło
1
Wygląda na to, że autor pytania pyta o listę katalogów Pythona, a nie ścieżkę do rzeczywistego pliku wykonywalnego Pythona.
Sergey Shubin