Зачем использовать sys.path.append(путь) вместо sys.path.insert(1, path)?
Изменить: на основе комментария Ulf Rompe, важно использовать "1" вместо "0" , иначе вы сломаете sys.path.
Я занимаюсь python довольно долго (более года), и я всегда смущен тем, почему люди рекомендуют использовать sys.path.append()
вместо sys.path.insert()
. Позвольте мне продемонстрировать.
Скажем, я работаю над модулем PyWorkbooks (который установлен на моем компьютере), но я одновременно работаю над другим модулем (скажем, PyJob), который включает PyWorkbooks. Когда я работаю над PyJob, я нахожу ошибки в PyWorkbooks, которые исправляю, поэтому я хочу импортировать версию для разработки.
Существует несколько способов работы над ними (например, я могу поместить проект PyWorkbooks внутри PyJob), но иногда мне все равно нужно будет играть с этим путем. Однако я не могу просто сделать 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)
, как если бы вы вручную вставляли путь, я думаю, можно с уверенностью сказать, что это путь, который вы хотите использовать!
Или у меня что-то не так? Это вопрос, который меня иногда беспокоит, и я хотел его открыть!
Ответы
Ответ 1
Если у вас несколько версий пакета/модуля, вы должны использовать virtualenv (внимание мое):
virtualenv
- это инструмент для создания изолированных сред Python.
Основная проблема, которая решается, - это одна из зависимостей и версий, а также косвенные разрешения. Представьте, что у вас есть приложение, которое нуждается в версии 1 LibFoo, но для другого приложения требуется версия 2. Как вы можете использовать оба этих приложения? Если вы установите все в /usr/lib/python2.7/site-packages
(или независимо от того,), его легко закончить в ситуации, когда вы непреднамеренно обновляете приложение, которое не должно быть обновлено.
Или, в общем, что, если вы хотите установить приложение и оставить его? Если приложение работает, любое изменение в его библиотеках или версиях этих библиотек может разорвать приложение.
Кроме того, что, если вы не можете установить пакеты в глобальный каталог site-packages
? Например, на общем хосте.
Во всех этих случаях virtualenv
может вам помочь. Он создает среду, в которой есть свои собственные каталоги установки, которые не обмениваются библиотеками с другими виртуальными средами (и, кроме того, не имеют доступа к глобально установленным библиотекам).
Вот почему люди считают, что insert(0,
ошибочен - это неполное, временное решение проблемы управления несколькими средами.
Ответ 2
Если вам действительно нужно использовать sys.path.insert, рассмотрите возможность оставить sys.path [0] как есть:
sys.path.insert(1, path_to_dev_pyworkbooks)
Это может быть важно, поскольку сторонний код может полагаться на sys.path documentation соответствие:
Как инициализировано при запуске программы, первый элемент этого списка, путь [0], это каталог, содержащий script, который использовался для вызовите интерпретатор Python.
Ответ 3
вы путаете концепцию добавления и добавления. следующий код добавляется:
sys.path.insert(1,'/thePathToYourFolder/')
он помещает новую информацию в начале (ну, во-вторых, если быть точным) последовательности поиска, которую проверит ваш интерпретатор. sys.path.append()
помещает вещи в самый конец последовательности поиска.
рекомендуется использовать что-то вроде virtualenv
вместо ручного кодирования каталогов пакетов в PYTHONPATH
каждый раз. для создания различных экосистем, которые отделяют ваши пакеты сайтов и возможные версии python, прочитайте эти два блога:
если вы решите перейти по пути к изолированности среды, вы, безусловно, выиграете, посмотрев на virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper/