Czy na stałe dodać katalog do PYTHONPATH?

324

Ilekroć użyję sys.path.append, nowy katalog zostanie dodany. Jednak po zamknięciu Pythona lista powróci do poprzednich (domyślnych?) Wartości. Jak mogę na stałe dodać katalog PYTHONPATH?

John Howard
źródło

Odpowiedzi:

135

Musisz dodać nowy katalog do zmiennej środowiskowej PYTHONPATH, oddzielony dwukropkiem od jego poprzedniej zawartości. W dowolnej formie Uniksa możesz to zrobić w skrypcie startowym odpowiednim dla powłoki, której używasz ( .profilelub cokolwiek, w zależności od ulubionej powłoki) za pomocą polecenia, które znowu zależy od powłoki; w systemie Windows można to zrobić za pomocą graficznego interfejsu użytkownika.

superuser.com może być lepszym miejscem do zadawania dalszych pytań, tj. po więcej szczegółów, jeśli potrzebujesz szczegółowych informacji o tym, jak wzbogacić zmienną środowiskową na wybranej platformie i powłoce, ponieważ tak naprawdę nie jest to pytanie programistyczne per se.

Alex Martelli
źródło
8
Errata: separator w systemie Windows miałby średnik. Jeśli musisz zastąpić ścieżki systemowe w systemie Windows, ustawienie za pomocą GUI jako zmiennej środowiskowej użytkownika może być niewystarczające, ponieważ zmienne użytkownika są dołączane do zmiennych systemowych. W takich przypadkach konieczne będzie skorzystanie ze skryptu uruchamiania, który wprowadza niezbędne zmiany.
Nathan Ernst
1
@Nathan, tx dla przypomnienia na średnikiem, ale (jeśli jesteś administratorem oczywiście), które można ustawić systemowe env.vars na okna (plus OP nie jest pytaniem, jak zastąpić ścieżkę, tak jak dołączyć do niego , więc środowisko env.var również będzie odpowiednie do tego! -).
Alex Martelli,
niestety nie jestem administratorem na moim komputerze stacjonarnym, więc muszę uciekać się do takich środków. :(
Nathan Ernst
438

Jeśli używasz bash (na dystrybucji Mac lub GNU / Linux), dodaj to do swojego ~/.bashrc

export PYTHONPATH="${PYTHONPATH}:/my/other/path"
awesomo
źródło
28
Działa to dla mnie idealnie, ale upewnij się, że katalog, który wskazujesz, ma najwyższy plik inicjujący .py w Twojej strukturze katalogów. Na początku nie było to dla mnie całkowicie jasne. Na przykład próbowałem wyeksportować PYTHONPATH = $ PYTHONPATH: / Users / joey / repos, ale to nie działało, ponieważ mój katalog repos nie miał _ init_ .py. Idąc dalej o jeden katalog dalej: / Users / joey / repos / specificRepo załatwiło sprawę . Teraz python może przechodzić przez dowolny katalog połączony w dół z określonym katalogiem REEP, który zawiera plik inicjujący .py!
Qiao Yi
3
to zadziałało dla mnie, ale czy możesz wyjaśnić, gdzie znajduje się ta zmienna PYTHONPATH? i skąd „eksport PYTHONPATH” wie, jak zlokalizować ten dokładny plik?
appleLover,
42
pamiętaj po edycji, ~/.bashrca następnie uruchom source ~/.bashrcpatrz stackoverflow.com/questions/2518127/…
b_dev,
1
Myślę, że umieszczenie sudo suna początku pliku .bashrc jest złym pomysłem . Ten post zgadza się ze mną. Przynajmniej w moim systemie nie jest to nawet konieczne.
LondonRob
Oto odpowiedź.
Aerin
88

Zamiast manipulacji PYTHONPATHmożesz również utworzyć plik konfiguracji ścieżki . Najpierw dowiedz się, w którym katalogu Python szuka tych informacji:

python -m site --user-site

Z jakiegoś powodu nie działa to w Pythonie 2.7. Tam możesz użyć:

python -c 'import site; site._script()' --user-site

Następnie utwórz .pthplik w tym katalogu zawierający ścieżkę, którą chcesz dodać (utwórz katalog, jeśli nie istnieje).

Na przykład:

# find directory
SITEDIR=$(python -m site --user-site)

# create if it doesn't exist
mkdir -p "$SITEDIR"

# create new .pth file with our path
echo "$HOME/foo/bar" > "$SITEDIR/somelib.pth"
coś
źródło
Próbowałem tego za pomocą Pythona 2.6 i wydaje się, że to nie działa dla mnie
Lorcan O'Neill
4
Właśnie dowiązałem ten katalog do własnego katalogu biblioteki i przechowuję tam wszystkie moje skrypty. Działało dobrze.
firesofmay
Postanowiłem spróbować ponownie po ponownym znalezieniu tego tematu i udało mu się sprawić, aby działał jak wyżej! Przeproszone i skruszone przeprosiny :)
Lorcan O'Neill
Działa to tak doskonale, że jestem na dobrej drodze, ale python -m site --user-sitei (create the directory if it doesn't exist)części były to, czego brakuje, aby uzyskać jego pracy.
Aurélien Ooms
1
Czy muszę zrobić dodatkowy krok, aby python rozpoznał dodaną ścieżkę somelib.pth? Jeśli nie, zgadnij, dlaczego to nie działa?
Miladiouss,
38

Działa to w systemie Windows

  1. W systemie Windows w języku Python 2.7 przejdź do folderu instalacyjnego Python.
  2. Otwórz pakiety Lib / site.
  3. Dodaj przykład.pth pusty plik do tego folderu.
  4. Dodaj wymaganą ścieżkę do pliku, po jednej w każdym wierszu.

Wtedy będziesz mógł zobaczyć wszystkie moduły w tych ścieżkach ze swoich skryptów.

auserdude
źródło
3
IMO, jest to najlepsze rozwiązanie, ponieważ nie zależy od wyboru powłoki lub środowiska pracy. Działa również na systemie Linux, gdzie domyślną ścieżką do Pythona jest „/usr/local/lib/pythonX.Y/site-packages”. Jeśli to nie zadziała, spróbuj zamiast tego umieścić plik .pth w katalogu dist-packages.
matus
1
Windows 7, Python 3.6.5. Oto odpowiedź. Jak napisał auserdude: Utwórz plik „example.pth” w folderze Lib / site-packages Pythona, a następnie dodaj swoją ścieżkę w następujący sposób: C: \ somefolder \ anotherfolder \
targetfolder
doskonała odpowiedź, działa również z Pythonem 3.7 w systemie Windows 10, moja ścieżka do systemu Windows 10 to: „C: \ Users \ {nazwa_usługi} \ AppData \ Local \ Programs \ Python \ Python37-32 \ Lib”
Ali80
Może potwierdzić, że działa w Pythonie 3.6.7 w systemie Windows 10. Należy jednak pamiętać, że ścieżka jest dołączana do zmiennej PYTHONPATH, co oznacza, że ​​dołączony moduł nie zostanie znaleziony w przypadku kolizji nazw.
BramAppel,
24

Jeśli ktoś nadal jest zdezorientowany - jeśli korzystasz z komputera Mac, wykonaj następujące czynności:

  1. Otwórz terminal
  2. Rodzaj open .bash_profile
  3. W wyskakującym pliku tekstowym dodaj ten wiersz na końcu: export PYTHONPATH=$PYTHONPATH:foo/bar
  4. Zapisz plik, uruchom ponownie Terminal i gotowe
entrepaul
źródło
1
Każdy, kto zastanawia się, jak zobaczyć ścieżkę pytona, użyj: który python
Arindam Roychowdhury
całkiem pewne, że musisz też przeładować terminal
Użytkownik
właściwie exportkluczem było to, czego mi brakowało !!!!, głosowałem, dziękuję bardzo!
a_m_dev
21

Możesz dodać ścieżkę za pomocą pliku pythonrc, który ma domyślnie ~ / .pythonrc w systemie Linux. to znaczy.

import sys
sys.path.append('/path/to/dir')

Możesz także ustawić PYTHONPATHzmienną środowiskową w globalnym pliku rc, takim jak ~/.profileMac lub Linux, lub za pomocą Panelu sterowania -> System -> zakładka Zaawansowane -> Zmienne środowiskowe w systemie Windows.

Niebieska Papryka
źródło
40
sys.path.append ('/ path / to / dir') nie dodaje wpisu na stałe.
jeremyjjbrown
15

Aby dać nieco więcej wyjaśnień, Python automatycznie konstruuje swoje ścieżki wyszukiwania (jak wspomniano powyżej i tutaj ) przy użyciu site.pyskryptu (zwykle znajdującego się w sys.prefix +, lib/python<version>/site-packagesjak również lib/site-python). Można uzyskać wartość sys.prefix:

python -c 'import sys; print(sys.prefix)'

Site.py skrypt następnie dodaje szereg katalogów, w zależności od platformy, takie jak /usr/{lib,share}/python<version>/dist-packages, /usr/local/lib/python<version>/dist-packagesna ścieżce przeszukiwania , a także wyszukuje te ścieżki w <package>.pthplikach konfiguracyjnych, które zawierają konkretne dodatkowe ścieżki wyszukiwania. Na przykład easy-install utrzymuje kolekcję zainstalowanych pakietów, które są dodawane do pliku specyficznego dla systemu, np. Na Ubuntu /usr/local/lib/python2.7/dist-packages/easy-install.pth. W typowym systemie jest kilka takich plików .pth, które mogą wyjaśnić niektóre nieoczekiwane ścieżki w sys.path:

python -c 'import sys; print(sys.path)'

Można więc utworzyć plik .pth i umieścić w dowolnym z tych katalogów (w tym sitedir, jak wspomniano powyżej ). Wydaje się, że jest to sposób, w jaki większość pakietów jest dodawana do sys.path, zamiast używać PYTHONPATH.

Uwaga: W OSX istnieje specjalna dodatkowa ścieżka wyszukiwania dodana przez site.py dla „kompilacji frameworka” (ale wydaje się, że działa w przypadku normalnego używania Pythona w wierszu poleceń): /Library/Python/<version>/site-packages(np. Dla Python2.7:), /Library/Python/2.7/site-packages/gdzie powinny znajdować się pakiety innych firm do zainstalowania (zobacz plik README w tym katalogu). Można więc dodać plik konfiguracyjny ścieżki zawierający dodatkowe ścieżki wyszukiwania, np. Utworzyć plik o nazwie, /Library/Python/2.7/site-packages/pip-usr-local.pthktóry zawiera, /usr/local/lib/python2.7/site-packages/a następnie python systemowy doda tę ścieżkę wyszukiwania.

Pierz
źródło
10

Dla mnie zadziałało, gdy zmieniłem .bash_profileplik. Zmiana .bashrcpliku działała tylko do momentu ponownego uruchomienia powłoki.

W Pythonie 2.7 powinno to wyglądać następująco:

export PYTHONPATH="$PYTHONPATH:/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python"

na końcu .bash_profilepliku.

Peter Piper
źródło
1
Jeśli dobrze rozumiem, spowoduje to wyeksportowanie zmiennej dla sesji Pythona uruchamianych za pośrednictwem terminala, prawda?
jxramos
1
@jxramos - tak!
Peter Piper,
9

W systemie Linux możesz utworzyć dowiązanie symboliczne ze swojego pakietu do katalogu PYTHONPATH bez konieczności zajmowania się zmiennymi środowiskowymi. Coś jak:

ln -s /your/path /usr/lib/pymodules/python2.7/
Zah
źródło
7

Dodawanie export PYTHONPATH="${PYTHONPATH}:/my/other/path"do ~ / .bashrc może nie działać, jeśli PYTHONPATHobecnie nie istnieje (z powodu :).

export PYTHONPATH="/my/other/path1"
export PYTHONPATH="${PYTHONPATH}:/my/other/path2"

Dodanie powyższego do mojego ~ / .bashrc załatwiło sprawę w Ubuntu 16.04

boyangeor
źródło
Zrobiłem to echo PYTHONPATHi nic się nie pokazało! oznacza to, że ta PYTHONPATH nie została zainicjowana, więc po prostu wklejam ten wiersz export PYTHONPATH=$PYTHONPATH:<PATH_TO_TF>/TensorFlow/models/research/object_detectiondo ~/.bashrcpliku i do source ~/.bashrc niego. Później, kiedy „powtórzyłem $ PYTHONPATH”, dało mi :<PATH_TO_TF>/TensorFlow/models/research/object_detectionto jakąś sugestię, czy zrobiłem coś złego?
Anu
export PYTHONPATH=<PATH_TO_TF>/TensorFlow/models/research/object_detection, kiedy eksportujesz PYTHONPATH po raz pierwszy, musisz to zrobić bez ${PYTHONPATH}:udziału
boyangeor
Dzięki, ale za każdym razem, gdy uruchamiam ponownie komputer, ścieżka do Pythona jest resetowana do tej, którą ustawiam na 1. tj. I :<PATH_TO_TF>/TensorFlow/models/research/object_detectionusuwa 2 export PYTHONPATH=$PYTHONPATH:/TensorFlow/models/research/slim.. jakieś sugestie na ten temat, jak to naprawić?
Anu
7

W systemie MacOS zamiast podawania ścieżki do określonej biblioteki. Podanie pełnej ścieżki do głównego folderu projektu w

~/.bash_profile 

sprawił, że mój dzień, na przykład:

export PYTHONPATH="${PYTHONPATH}:/Users/<myuser>/project_root_folder_path"

po tym wykonaj:

source ~/.bash_profile
testingh
źródło
6

Aby dodać odpowiedź awesomo, możesz również dodać tę linię do swojego ~/.bash_profilelub~/.profile

janex
źródło
Dodaj, .bash_profilejeśli używasz powłoki logowania, w przeciwnym razie użyj.profile
smac89,
3

Dodanie nowej ścieżki do PYTHONPATH odbywa się ręcznie przez:

dodając ścieżkę do swojego profilu ~ / .bashrc, w terminalu przez:

vim ~/.bashrc

wklej następujące elementy do swojego profilu

export PYTHONPATH="${PYTHONPATH}:/User/johndoe/pythonModule"

następnie upewnij się, że Twój profil bashrc jest za każdym razem, gdy uruchamiasz swój kod w terminalu:

source ~/.bashrc 

Mam nadzieję że to pomoże.

wpmoradi
źródło
2

Dodałem na stałe do systemu Windows Vista, Python 3.5

System> Panel sterowania> Zaawansowane ustawienia systemu> Zaawansowane (dotknij) Zmienne środowiskowe> Zmienne systemowe> (jeśli nie widzisz zmiennej PYTHONPATH w kolumnie Zmienna) (kliknij) Nowy> Nazwa zmiennej: PYTHONPATH> Wartość zmiennej:

Zapisz katalog w wartości zmiennej. To szczegóły odpowiedzi Blue Peppers.

Cloud Cho
źródło
1

Poniższy skrypt działa na wszystkich platformach, ponieważ jest czystym Pythonem. Wykorzystuje ścieżkę pathlib, udokumentowaną tutaj https://docs.python.org/3/library/pathlib.html , aby działała na wielu platformach. Uruchom go raz, zrestartuj jądro i to wszystko. Inspirowany przez https://medium.com/@arnaud.bertrand/modifying-python-s-search-path-with-pth-files-2a41a4143574 .

from pathlib import Path
to_add=Path(path_of_directory_to_add)
from sys import path

if str(to_add) not in path:
    minLen=999999
    for index,directory in enumerate(path):
        if 'site-packages' in directory and len(directory)<=minLen:
            minLen=len(directory)
            stpi=index

    pathSitePckgs=Path(path[stpi])
    with open(str(pathSitePckgs/'current_machine_paths.pth'),'w') as pth_file:
        pth_file.write(str(to_add))
andrei deusteanu
źródło
1

To jest aktualizacja tego wątku, która zawiera kilka starych odpowiedzi.

Dla osób używających MAC-OS Catalina lub nowszych (> = 10,15), wprowadzono nowy terminal o nazwie zsh(zamiennik starego bash).

Miałem pewne problemy z powyższymi odpowiedziami z powodu tej zmiany i nieco rozwiązałem ten problem, tworząc plik ~/.zshrci wklejając katalog plików do $PATHi$PYTHONPATH

Najpierw zrobiłem:

nano ~/.zshrc

Po otwarciu edytora wkleiłem następującą treść:

export PATH="${PATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"
export PYTHONPATH="${PYTHONPATH}:/Users/caio.hc.oliveira/Library/Python/3.7/bin"

zapisał go i ponownie uruchomił terminal.

WAŻNE: Ścieżka powyżej jest ustawiona na ścieżkę mojego komputera, musisz ją dostosować do swojego pytona.

Caio Oliveira
źródło
0

W Python 3.6.4 możesz utrzymywać sys.path w sesjach Pythona w następujący sposób:

import sys
import os

print(str(sys.path))

dir_path = os.path.dirname(os.path.realpath(__file__))
print(f"current working dir: {dir_path}")

root_dir = dir_path.replace("/util", '', 1)
print(f"root dir: {root_dir}")

sys.path.insert(0, root_dir)

print(str(sys.path))

Zdecydowanie zalecamy korzystanie z virtualenv i virtualenvwrapper, w przeciwnym razie zagracisz swoją ścieżkę

Gumowa kaczuszka
źródło
-3

Najkrótsza ścieżka między A <-> B to linia prosta;

import sys
if not 'NEW_PATH' in sys.path:
  sys.path += ['NEW_PATH']
Al Kari
źródło