Edycja: w oparciu o komentarz Ulfa Rompe'a, ważne jest, abyś używał „1” zamiast „0” , w przeciwnym razie zepsujesz sys.path .
Pythona zajmuję się już od jakiegoś czasu (ponad rok) i zawsze jestem zdezorientowany, dlaczego ludzie zalecają używanie sys.path.append()
zamiast sys.path.insert()
. Pokażę.
Powiedzmy, że pracuję nad modułem o nazwie PyWorkbooks (który jest zainstalowany na moim komputerze), ale jednocześnie pracuję nad innym modułem (powiedzmy PyJob), który zawiera PyWorkbooks. Podczas pracy nad PyJob znajduję błędy w PyWorkbooks, które poprawiam, więc chciałbym zaimportować wersję rozwojową.
Istnieje wiele sposobów pracy nad obydwoma (na przykład mógłbym umieścić mój projekt PyWorkbooks w PyJob), ale czasami nadal będę musiał bawić się ścieżką. Jednak nie mogę po prostu zrobić a sys.path.append()
do folderu, w którym znajduje się PyWorkbooks . Czemu? Ponieważ python najpierw znajdzie moje zainstalowane PyWorkbooks!
Dlatego musisz wykonać sys.path.insert (1, path_to_dev_pyworkbooks)
W podsumowaniu:
sys.path.append(path_to_dev_pyworkbooks)
import PyWorkbooks # does NOT import dev pyworkbooks, imports installed one
lub:
sys.path.insert(1, path_to_dev_pyworkbooks) # based on comments you should use **1 not 0**
import PyWorkbooks # imports correct file
W przeszłości spowodowało to kilka problemów i naprawdę chciałbym, abyśmy (jako społeczność) zaczęli polecać sys.path.insert(1, path)
, tak jakbyś ręcznie wstawiał ścieżkę. Myślę, że można bezpiecznie powiedzieć, że jest to ścieżka, której chcesz używać!
Czy coś jest nie tak? To pytanie, które czasami mnie niepokoi i chciałem, aby było otwarte!
źródło
sys.path.insert(1, dev_folder)
ale nadal nie znajduje modułu dev i używa tylko zainstalowanego modułu. Jak to naprawić?Odpowiedzi:
Jeśli masz wiele wersji pakietu / modułu, musisz używać virtualenv (moje podkreślenie):
Dlatego ludzie uważają,
insert(0,
że się mylą - jest to niepełne, prowizoryczne rozwiązanie problemu zarządzania wieloma środowiskami.źródło
virtualenv
i właściwie szukam powiązanego odpowiedzi na OP)venv
.Jeśli naprawdę potrzebujesz użyć sys.path.insert, rozważ pozostawienie sys.path [0] takim, jakim jest:
sys.path.insert(1, path_to_dev_pyworkbooks)
Może to być ważne, ponieważ kod strony trzeciej może polegać na zgodności dokumentacji sys.path :
źródło
mylisz koncepcję dołączania i poprzedzania. następujący kod jest w trakcie:
sys.path.insert(1,'/thePathToYourFolder/')
umieszcza nowe informacje na początku (dobrze, po drugie, żeby być precyzyjnym) sekwencji wyszukiwania, przez którą przejdzie twój interpreter.
sys.path.append()
umieszcza rzeczy na samym końcu sekwencji wyszukiwania.wskazane jest, abyś używał czegoś takiego
virtualenv
zamiast ręcznego kodowania katalogów z pakietami zaPYTHONPATH
każdym razem. aby skonfigurować różne ekosystemy oddzielające pakiety witryn i możliwe wersje Pythona, przeczytaj te dwa blogi:wprowadzenie do ekosystemów Pythona
ładowanie środowisk wirtualnych Pythona
jeśli zdecydujesz się pójść ścieżką do izolacji środowiska, z pewnością skorzystasz na przejrzeniu virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper/
źródło