Почему virtualenv не создает папку DLL? - PullRequest
8 голосов
/ 12 июля 2011

Мне интересно, почему virtualenv не создает папку DLLs так же, как создает папки Lib и Scripts?

Вопрос возник, когда у меня возникла следующая проблема с PyDev;
Я установил один из моих virtualenvs как интерпретатор Python, и все было в порядке, за исключением одного. Я продолжал получать предупреждения о неразрешенном импорте для всего импорта из модуля select. Это связано с тем, что модуль select, в отличие от большинства других, присутствует только в папке DLL.

Ответы [ 3 ]

8 голосов
/ 16 января 2013

Я исследовал эту тему немного больше.Я начал с заявления techtonik - Ответ прост - никто не реализовал его. Однако возникает другой вопрос - почему никто не реализовал это?Я подозреваю, что ответ, потому что это работает.Это приводит к еще одному вопросу - почему это работает?

Причина, по которой все работает без копирования папки DLLs в virtualenv, заключается в том, что

  • Python выполняет поиск sys.path, чтобы найти любойdll ему нужно
  • sys.path после того, как активация virtualenv содержит путь к исходной папке DLLs

Первый оператор можно просто проверить, удалив путь к папке DLLs из sys.path и пытается импортировать модуль select (для этого модуля требуется файл select.pyd из папки DLLs), который затем завершается ошибкой.

В комментарии вы говорите Я хотел бы сохранить модуль PythonБиблиотеки DLL в виртуальной среде вместе с кодом Python. Это возможно, просто скопировав папку DLLs в virtualenv.Причина, по которой это работает, заключается в том, что sys.path после активации virtualenv содержит также путь к папке DLLs внутри virtualenv (хотя при создании virtualenv такой папки не создается).Этот путь помещается перед путем к исходной папке DLLs, что означает, что он сначала ищется и, таким образом, переопределяет исходную папку DLLs.

Я опубликовал вопрос с названием Папка DLLs в Windows вСписок рассылки Python.

6 голосов
/ 15 января 2013

Ответ прост - никто не реализовал его.Когда я создал патч для копирования pythonXX.dll в среду virtualenv - я решал другую проблему:

Когда Python установлен в масштабе всей системы - двоичный файл python.exe, который копируется в virtualenv, всегда может найтиего pythonXX.dll, потому что этот .dll доступен из Windows \ System32.Если Python установлен только для текущего пользователя - файл pythonXX.dll помещается в каталог PythonXX, в котором находится оригинальный файл python.exe.Поэтому проблема, которую я решал, состоит в том, чтобы исправить virtualenv, созданный с установленным Python для текущего пользователя.Было довольно сложно откопать все это.

Вернуться к вопросу.Я действительно не знаю, как этот pythonXX.dll находит свои модули DLL - это вопрос к разработчикам Python, но я подозреваю, что он их не находит.Причина, по которой я не исправил эту проблему при исправлении проблемы # 87 , заключается в том, что мой код, вероятно, никогда не использовал модули из этого каталога DLL.

3 голосов
/ 10 января 2013

ИМО есть еще причины для этого:

  • Безопасность: в некоторых средах политика запрещает выполнение / загрузку материалов из случайных мест в попытке предотвратить нарушения безопасности. Таким образом,
  • Несколько известная DLL load order , которая предотвращает загрузку вредоносных dll :). Смотри также здесь

НТН,

...