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!

Author: dreftymac, 2012-04-10

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.

 42
Author: agf,
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.

 40
Author: Ulf Rompe,
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:

  1. Python ecosystems wprowadzenie

  2. Bootstrapping środowiska wirtualne Pythona

Jeśli zdecydujesz się przejść ścieżką do izolacji środowiska, z pewnością skorzystasz, patrząc na virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper/

 12
Author: samkhan13,
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