Подтвердить что ты не робот

Зачем использовать 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), как если бы вы вручную вставляли путь, я думаю, можно с уверенностью сказать, что это путь, который вы хотите использовать!

Или у меня что-то не так? Это вопрос, который меня иногда беспокоит, и я хотел его открыть!

4b9b3361

Ответ 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/