pip Virtualenv против каталога в проекте - PullRequest
0 голосов
/ 01 июля 2018

Почему pip необходимо использовать виртуальные среды для изоляции пакетов для каждого проекта, а не просто устанавливать их в каталог по умолчанию в проекте? Это кажется дополнительной сложностью без пользы.

NPM, например, устанавливает пакеты в <project_root>\node_modules по умолчанию. Виртуальная среда не требуется, а пакеты по-прежнему устанавливаются независимо от проекта.

Редактировать: Для ясности, я заинтересован в практических преимуществах использования виртуальных сред pip по сравнению с системами управления пакетами, такими как NPM, Nuget и Webpack, которые все используют каталоги в проекте. В противном случае, если это всего лишь ограничение системы модулей Python, мне было бы интересно это знать.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Я думаю, может быть, вы не знаете, что такое виртуальная среда.

Если вы поместите какой-либо модуль в директорию проекта, например, myproj/modules, вам нужно будет добавить myproj/modules к пути поиска, который использует Python, чтобы найти ваш модуль. Один из способов сделать это - определить или изменить переменную среды PYTHONPATH. Во всех каталогах, перечисленных в этой переменной, будет производиться поиск модулей в дополнение к некоторому жестко заданному набору каталогов.

$ export PYTHONPATH=./myproj/modules

Однако это действительно все, что представляет собой виртуальная среда. Каталог содержит желаемую версию Python, а также любые модули, которые вы хотите использовать. Сценарий activate, который вы запускаете для «включения» виртуальной среды, делает чуть больше, чем устанавливает значения PATH и PYTHONPATH, так что при каждом запуске python используется как правильная версия, так и ваш специфичный для проекта набор модулей используется вместо любой глобальной библиотеки.

0 голосов
/ 01 июля 2018

Потому что модульная система Python не работает таким образом. Если бы pip был установлен, скажем, requests, просто загрузив его в каталог python_modules, этого было бы недостаточно, чтобы import requests заработал; это должно быть import python_modules.requests, но тогда у нас все равно будут проблемы, когда requests попытается импортировать одну из его зависимостей, так как для этого также потребуется предопределенный python_modules, и это будет большой беспорядок. Решение, которое используют виртуальные среды, состоит в том, чтобы изменить переменную среды PYTHONPATH, включив в нее python_modules, а также некоторые дополнительные функции, позволяющие заботиться о исполняемых скриптах и ​​не импортировать пакеты извне virtualenv.

...