Po co używać sys./ align = "left" / append (path) zamiast sys./ align = "left" / insert (1, path)?
Edit: bazując na komentarzu Ulfa Rompe, ważne jest, abyś użył "1" zamiast "0", w przeciwnym razie złamiesz sys.ścieżka .
Zajmuję się Pythonem już od jakiegoś czasu (ponad rok) i zawsze jestem zdezorientowany, dlaczego ludzie zalecają używanie sys.path.append()
zamiast sys.path.insert()
. Zademonstruję.
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 powiedzmy PyJob), który zawiera PyWorkbooks. Ponieważ pracuję nad Pyjobem, 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 mogę umieścić mój projekt PyWorkbooks w PyJob), ale czasami nadal będę musiał pobawić się ścieżką. Jednak nie mogę po prostu zrobić sys.path.append()
do folderu, w którym znajduje się PyWorkbooks . Dlaczego? Bo python znajdzie moje zainstalowane Pyworkbooki pierwszy!
Dlatego musisz zrobić sys./ align = "left" / 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
To spowodowało kilka zawieszeń dla mnie w przeszłości, i naprawdę chciałbym, abyśmy (jako społeczność) zaczęli zalecać sys.path.insert(1, path)
, tak jak gdybyś ręcznie wstawiał ścieżkę, myślę, że można bezpiecznie powiedzieć, że jest to ścieżka, której chcesz użyć!
Czy mam coś nie tak? To pytanie, które czasem mnie niepokoi i chciałam je w otwórz!
3 answers
Jeśli masz kilka wersji pakietu / modułu, musisz użyć virtualenv (podkreślenie moje):
virtualenv
jest narzędziem do tworzenia izolowanych środowisk Pythona.Podstawowym problemem jest jeden z Zależności i wersji, a pośrednio uprawnienia. wyobraź sobie, że masz aplikację, która potrzebuje wersji 1 LibFoo, ale inna aplikacja wymaga wersji 2. Jak można korzystać z obu tych aplikacji? Jeśli zainstalujesz wszystko w
/usr/lib/python2.7/site-packages
(lub gdziekolwiek jest standardowa lokalizacja platformy) łatwo jest znaleźć się w sytuacji, w której nieumyślnie zaktualizujesz aplikację, która nie powinna być uaktualniona.Lub bardziej ogólnie, co zrobić, jeśli chcesz zainstalować aplikację i zostawić ją? Jeśli aplikacja działa, wszelkie zmiany w jej bibliotekach lub wersjach tych bibliotek mogą ją złamać.
A co jeśli nie możesz zainstalować pakietów w globalnym katalogu
site-packages
? Na przykład, na wspólnym gospodarzu.We wszystkich tych przypadkach,
virtualenv
może Ci pomóc. Tworzy środowisko, które ma własne katalogi instalacyjne, które nie współdzieli bibliotek z innymi środowiskami virtualenv (i opcjonalnie nie ma dostępu do globalnie zainstalowanych bibliotek).
Dlatego ludzie uważają insert(0,
za błędne -- jest to niekompletne, stopgapowe rozwiązanie problemu zarządzania wieloma środowiskami.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-10 19:23:47
Jeśli naprawdę potrzebujesz użyć sys./ align = "left" / insert, rozważ pozostawienie sys.ścieżka [0] jak jest:
sys.path.insert(1, path_to_dev_pyworkbooks)
To może być ważne, ponieważ kod trzeciej strony może polegać na sys.dokumentacja ścieżki zgodność:
Zainicjowany po uruchomieniu programu, pierwszy element tej listy, path[0], jest katalogiem zawierającym skrypt, który został użyty do wywołaj interpreter Pythona.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-10 22:47:18
Mylisz pojęcie dodawania i poprzedzania. poniższy kod jest poprzedzający:
sys.path.insert(1,'/thePathToYourFolder/')
Umieszcza nowe informacje na początku (dobrze, drugi, aby być precyzyjnym) sekwencji wyszukiwania, przez którą przechodzi Twój interpreter. sys.path.append()
umieszcza rzeczy na samym końcu sekwencji wyszukiwania.
Zaleca się używanie czegoś w rodzaju virtualenv
zamiast ręcznego kodowania katalogów pakietów do PYTHONPATH
za każdym razem. do tworzenia różnych ekosystemów, które oddziel swoją witrynę-pakiety i możliwe wersje Pythona, przeczytaj te dwa blogi:
Jeśli zdecydujesz się przejść ścieżką do izolacji środowiska, z pewnością skorzystasz, patrząc na virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-21 17:45:13