Изменить: основываясь на комментарии Ульфа Ромпе, важно использовать «1» вместо «0» , иначе вы нарушите sys.path .
Я занимаюсь питоном уже довольно давно (более года), и меня всегда смущает, почему люди рекомендуют вам использовать sys.path.append()
вместо sys.path.insert()
. Позвольте мне продемонстрировать.
Скажем, я работаю над модулем PyWorkbooks (установленным на моем компьютере), но одновременно работаю над другим модулем (скажем, PyJob), который включает PyWorkbooks. Когда я работаю над PyJob, я нахожу ошибки в PyWorkbooks, которые исправляю, поэтому я хотел бы импортировать версию для разработки.
Есть несколько способов работать с обоими (например, я мог бы поместить свой проект PyWorkbooks в PyJob), но иногда мне все равно нужно поиграть с путем. Однако я не могу просто сделать a sys.path.append()
с папкой, в которой находится PyWorkbooks . Зачем? Потому что python сначала найдет мои установленные PyWorkbooks!
Вот почему вам нужно сделать sys.path.insert (1, path_to_dev_pyworkbooks)
В итоге:
sys.path.append(path_to_dev_pyworkbooks)
import PyWorkbooks # does NOT import dev pyworkbooks, imports installed one
или:
sys.path.insert(1, path_to_dev_pyworkbooks) # based on comments you should use **1 not 0**
import PyWorkbooks # imports correct file
Это вызывало у меня несколько зависаний в прошлом, и мне бы очень хотелось, чтобы мы (как сообщество) начали рекомендовать sys.path.insert(1, path)
, как будто вы вручную вставляете путь, я думаю, можно с уверенностью сказать, что это тот путь, который вы хотите использовать!
Или у меня что-то не так? Этот вопрос иногда беспокоит меня, и я хотел, чтобы он был открыт!
источник
sys.path.insert(1, dev_folder)
но он все еще не находит модуль dev, а использует только установленный модуль. Как это исправить?Ответы:
Если у вас есть несколько версий пакета / модуля, вам нужно использовать virtualenv (выделено мной):
Вот почему люди считают,
insert(0,
что ошибаются - это неполное временное решение проблемы управления несколькими средами.источник
virtualenv
и я действительно ищу связанный ответ на OP)venv
.Если вам действительно нужно использовать sys.path.insert, оставьте sys.path [0] как есть:
sys.path.insert(1, path_to_dev_pyworkbooks)
Это может быть важно, поскольку сторонний код может полагаться на соответствие документации sys.path :
источник
вы путаете понятия добавления и добавления. следующий код добавляется к началу:
sys.path.insert(1,'/thePathToYourFolder/')
он помещает новую информацию в начало (ну, во-вторых, если быть точным) последовательности поиска, которую будет проходить ваш интерпретатор.
sys.path.append()
помещает вещи в самый конец поисковой последовательности.желательно, чтобы вы использовали что-то вроде
virtualenv
вместо того, чтобы вручную кодировать каталоги пакетов вPYTHONPATH
каждый раз. для настройки различных экосистем, разделяющих пакеты вашего сайта и возможные версии python, прочтите эти два блога:введение в экосистемы Python
начальная загрузка виртуальных сред Python
Если вы все же решите пойти по пути изоляции среды, вам, безусловно, будет полезно заглянуть в virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper/
источник