Зачем использовать sys.path.append (путь) вместо sys.path.insert (1, path)?

Изменить: на основе комментария Ульфа Ромпе важно, чтобы вы использовали «1» вместо «0» , иначе вы сломаете sys.path .

Я занимаюсь python довольно долго (более года), и я всегда смущен тем, почему люди рекомендуют использовать sys.path.append() вместо sys.path.insert() . Позвольте мне продемонстрировать.

  • Прочитать локальный файл в django
  • Как узнать путь запущенного скрипта в Python?
  • Проверить, существует ли исполняемый файл в Python?
  • Как мне получить путь к скрипту Python, в котором я запущен?
  • Как я могу получить Python путь под Windows?
  • Что устанавливает sys.path с Python и когда?
  • Предположим, что я работаю над модулем 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) , как если бы вы вручную вставляли путь, я думаю, что это чтобы сказать, что это путь, который вы хотите использовать!

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

  • Не удалось получить действительное имя пути из python os.path.abspath
  • Windows не может найти файл на subprocess.call ()
  • установить pythonpath перед операциями импорта
  • Point Django в разных версиях Python
  • Развернуть путь поиска Python к другому источнику
  • Как получить длинный путь файловой системы от python в Windows
  • 3 Solutions collect form web for “Зачем использовать sys.path.append (путь) вместо sys.path.insert (1, path)?”

    Если у вас несколько версий пакета / модуля, вам нужно использовать virtualenv (выделение мое):

    virtualenv – это инструмент для создания изолированной среды Python.

    Основная проблема, которая решается, – это одна из зависимостей и версий, а также косвенные разрешения. Представьте, что у вас есть приложение, которое нуждается в версии 1 LibFoo, но для другого приложения требуется версия 2. Как вы можете использовать оба этих приложения? Если вы установите все в /usr/lib/python2.7/site-packages (или независимо от стандартного местоположения вашей платформы), легко оказаться в ситуации, когда вы непреднамеренно обновляете приложение, которое не нужно обновлять.

    Или, в общем, что, если вы хотите установить приложение и оставить его ? Если приложение работает, любое изменение в его библиотеках или версиях этих библиотек может разорвать приложение.

    Кроме того, что делать, если вы не можете устанавливать пакеты в каталог глобальных site-packages ? Например, на общем хосте.

    Во всех этих случаях virtualenv может вам помочь. Он создает среду, в которой есть свои собственные каталоги установки, которые не обмениваются библиотеками с другими виртуальными средами (и, возможно, также не получают доступ к глобально установленным библиотекам).

    Вот почему люди считают insert(0, чтобы ошибаться – это неполное, временное решение проблемы управления несколькими средами.

    Если вам действительно нужно использовать sys.path.insert, подумайте о том, чтобы оставить sys.path [0] как есть:

     sys.path.insert(1, path_to_dev_pyworkbooks) 

    Это может быть важно, поскольку сторонний код может полагаться на соответствие документации sys.path :

    Как инициализировано при запуске программы, первым элементом этого списка является путь [0], это каталог, содержащий скрипт, который использовался для вызова интерпретатора Python.

    вы путаете концепцию добавления и добавления. следующий код:

     sys.path.insert(1,'/thePathToYourFolder/') 

    он помещает новую информацию в начале (ну, во-вторых, если быть точным) последовательности поиска, которую проверит ваш интерпретатор. sys.path.append() помещает вещи в самый конец последовательности поиска.

    рекомендуется использовать что-то вроде virtualenv вместо ручной кодировки каталогов пакетов в PYTHONPATH каждый раз. для создания различных экосистем, которые отделяют ваши пакеты сайтов и возможные версии python, прочитайте эти два блога:

    1. внедрение экосистемы питона

    2. загрузочные виртуальные среды python

    если вы решите перейти по пути к изоляции среды, вы, безусловно, выиграете, посмотрев на virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper/

    Python - лучший язык программирования в мире.