Jak dodać ścieżkę do PYTHONPATH w virtualenv

97

Próbuję dodać ścieżkę do zmiennej środowiskowej PYTHONPATH, która byłaby widoczna tylko z określonego środowiska virtualenv.

Próbowałem SET PYTHONPATH=...w wierszu polecenia virtualenv, ale to ustawia zmienną dla całego środowiska.

Jak to osiągnąć?

Flavien
źródło

Odpowiedzi:

155

Zwykle można uniknąć konieczności robienia czegokolwiek z PYTHONPATH, używając .pthplików . Po prostu umieść plik z rozszerzeniem .pth (jakakolwiek podstawowa nazwa działa) w folderze pakietów witryn virtualenv, np. lib\python2.7\site-packagesZ bezwzględną ścieżką do katalogu zawierającego twój pakiet jako jedyną zawartość.

djowie
źródło
Niestety nie działa to jako nadpisanie. Dołącza ścieżkę, więc jeśli ją rozwijasz, nie działa.
Erik Aronesty
Ponadto, jeśli znasz ścieżkę absolutną, jaki jest sens zmiennej?
Jamie Marshall
możesz także przejść do folderu site-packages środowiska wirtualnego i utworzyć dowiązanie symboliczne do pliku .pth, na przykład: ln -s ścieżka / do / jakiś plik.pth. Okazało się to przydatne, gdy potrzebowałem tego samego katalogu, aby był dostępny w wielu środowiskach wirtualnych
plik danych
91

Jeśli używasz virtualenv, prawdopodobnie powinieneś również używać virtualenvwrapper , w takim przypadku możesz użyć polecenia add2virtualenv, aby dodać ścieżki do ścieżki Pythona dla bieżącego virtualenv:

add2virtualenv directory1 directory2 …

crimeminister
źródło
3
A co z usunięciem z virtualenv?
silverdagger,
1
Chcę dodać przyjazny komentarz, że na współdzielonych gospodarzach i podobnych sytuacjach opakowanie venv nie jest pożądane. W takich przypadkach działa jedna wentylacja i wszystko, co jest potrzebne, aby dodatkowa instalacja nie była pożądana. Lokalnie jest inaczej, ale na serwerze / obrazie KISS jest naprawdę ważny.
Marc
2
Nie jestem pewien, jak to polecenie działało, gdy zostało napisane, ale add2virtualenvnie modyfikuje $ PYTHONPATH, a raczej modyfikuje sys.path.
ForeverWintr
1
@ajostergaard: Przepraszam, powinienem był podać źródło. Jeśli spojrzysz na kod źródłowy programu add2virtualenv, zobaczysz, że modyfikuje on sys.path. Zgadzam się, że dokumenty sprawiają, że brzmi to tak, jakby modyfikowała PYTHONPATHzmienną środowiskową, ale wydaje się, że jest to niepoprawne. bitbucket.org/virtualenvwrapper/virtualenvwrapper/src/...
ForeverWintr
1
@ForeverWintr Stoję poprawiony - pliki .pth są używane do konfiguracji sys.path. docs.python.org/2/library/site.html Confused.com!
ostergaard
5

Możesz także spróbować umieścić dowiązanie symboliczne do jednego z twoich virtualenv.

na przykład. 1) aktywuj virtualenv 2) uruchom Pythona 3) importuj sys i sprawdź sys.path 4) znajdziesz tam ścieżkę wyszukiwania Pythona. Wybierz jeden z nich (np. Pakiety-witryn) 5) przejdź tam i utwórz dowiązanie symboliczne do swojego pakietu, takie jak: ln -s ścieżka-do-twojego-pakietu nazwa-z-którego-będziesz-importować

W ten sposób powinieneś być w stanie zaimportować go nawet bez aktywacji virtualenv. Po prostu spróbuj: path-to-your-virtualenv-folder / bin / python i zaimportuj swój pakiet.

Slavko-t
źródło
Wydaje mi się, że zostało to odrzucone za używanie dowiązań symbolicznych zamiast plików .pth. U mnie jednak zadziałało, więc cokolwiek.
Gareth Davidson
3

Jeśli używasz virtualenvwrapper,

$ cd to the parent folder
$ add2virtualenv  folder_to_add

konsola wyświetli

Warning: Converting "folder_to_add" to "/absoutle/path/to/folder_to_add"

To wszystko i powinieneś być gotowy

Aneesh Panoli
źródło
1
import sys
import os

print(str(sys.path))

dir_path = os.path.dirname(os.path.realpath(__file__))
print("current working dir: %s" % dir_path)

sys.path.insert(0, dir_path)

Zdecydowanie sugeruję użycie virtualenv i virtualenvwrapper, aby uniknąć zaśmiecania ścieżki.

Gumowa kaczuszka
źródło
jeśli chcesz, aby to działało z dowolną wersją Pythona, po prostu użyj zwykłego, starego formatu ciągu znaków zamiast fantazyjnego f-string f "... {dir_path}"
Guillaume S
Dziękuję za komentarz. Poprawiłem do użytku. stare sposoby są uciążliwe i specyficzne, a prosty system szablonów nie ma nic wyszukanego
Rubber Duck,
Wszystko jest względne :)
Guillaume S