Jak w skrypcie Python ustawić PYTHONPATH?

115

Wiem, jak to ustawić w moim / etc / profile i moich zmiennych środowiskowych.

Ale co, jeśli chcę ustawić to podczas skryptu? Czy to import OS, sys? Jak mam to zrobić?

TIMEX
źródło

Odpowiedzi:

192

Nie ustawiasz PYTHONPATH, dodajesz wpisy do sys.path. Jest to lista katalogów, które powinny być przeszukiwane pod kątem pakietów Pythona, więc możesz po prostu dołączyć swoje katalogi do tej listy.

sys.path.append('/path/to/whatever')

W rzeczywistości sys.pathjest inicjowany przez podzielenie wartości PYTHONPATHznaku separatora ścieżki ( :w systemach typu Linux,; w systemie Windows).

Możesz również dodawać katalogi za pomocą site.addsitedir, a ta metoda uwzględni również .pthpliki istniejące w przekazanych katalogach. (Nie miałoby to miejsca w przypadku katalogów określonych w PYTHONPATH).

David Z
źródło
11
Minęło wiele lat od opublikowania tej odpowiedzi, ale nadal chcę dodać, że jeśli chcesz się upewnić, że Python sprawdza nowy katalog przed wszystkimi innymi podczas importowania, powinieneś umieścić nowy katalog jako pierwszy na liście, ponieważ w sys.path.insert(0, '/path/to/whatever').
wecsam
39

Możesz pobrać i ustawić zmienne środowiskowe poprzez os.environ:

import os
user_home = os.environ["HOME"]

os.environ["PYTHONPATH"] = "..."

Ale ponieważ Twój tłumacz już działa, nie przyniesie to żadnego efektu. Lepiej jest używać

import sys
sys.path.append("...")

która jest tablicą, w którą PYTHONPATHzostanie przekształcony przy uruchomieniu interpretera.

miku
źródło
18

Jeśli wstawisz sys.path.append('dir/to/path')bez zaznaczenia, że ​​jest już dodany, możesz wygenerować długą listę w sys.path. W tym celu polecam:

import sys
import os # if you want this directory

try:
    sys.path.index('/dir/path') # Or os.getcwd() for this directory
except ValueError:
    sys.path.append('/dir/path') # Or os.getcwd() for this directory
Francisco Manuel Garca Botella
źródło
2
Miły. Bardzo Pythonic.
Częściowe zamówienie
1
Jak mogę opróżnić PythonPath? Nie chcę dołączać. Chcę go opróżnić i włożyć do środka to, czego chcę. Czy jest na to sposób?
Schütze
Czy próbowałeś ponownie zainicjować go, wywołując sys.path .__ init __ ()? Powinno to opróżnić ścieżkę Pythona. Mam nadzieję że to pomoże.
Thayz,
@ francisco-manuel-garca-botella Odpowiadanie na stare pytania jest mile widziane na tej stronie! Nie ma za co przepraszać.
user7610
Nie zgadzam się, że jest to pythonowe i sugerowałbym, że nie jest to dobre podejście do programowania. Obsługa wyjątków jest bardzo kosztowna, gdy wystąpi wyjątek, więc nie chcesz jej używać do zastępowania instrukcji „if”, w przypadku gdy jest całkiem możliwe, że użyjesz else. Prosta, jeśli „mypath” w sys.path ... inaczej ... byłaby moja rada.
markgalassi
6

PYTHONPATH kończy się w sys.path , który można modyfikować w czasie wykonywania.

import sys
sys.path += ["whatever"]
unbeli
źródło
Czy jest jakiś powód, aby preferować tę odpowiedź od tej od @DavidZ?
Dror,
Jeśli nic więcej, jest mniej szczegółowe.
tripleee
-1

możesz ustawić PYTHONPATH, os.environ['PATHPYTHON']=/some/pathnastępnie musisz wywołać, os.system('python')aby zrestartować powłokę Pythona, aby nowo dodana ścieżka była skuteczna.

tesla1060
źródło
1
os.system()nie „restartuje powłoki Pythona”, uruchamia nową interaktywną instancję Pythona. Kiedy wrócisz z tego, wrócisz do skryptu wywołującego.
tripleee
-2

W Linuksie to też działa:

import sys
sys.path.extend(["/path/to/dotpy/file/"])
lashgar
źródło