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)?


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 = []

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.


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)

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.


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

-1

Użyj tego:

import sys
print(sys.executable)

Lub jedna linia z cmd:

python -c "import sys; print(sys.executable)"

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.