Проще говоря:
Как я могу гарантировать, что используется мой virtualenv, а не нативный env?
Проблема с другими ответами:
Я видел много ответов на этот вопрос, но ответы лаконичны и в основном охватывают сценарий "plug 'n play" виртуальной среды.
Мой сценарий:
Предположим, что виртуальная среда Python (myEnv) находится в достаточно сложной папке, а машина, на которой она работает, - достаточно сложная (targetEnv). Предположим, что в virtualenv (myEnv) есть много настроек и что переменная evn в этом virtualenv модифицируется способами, которые мы не можем знать (пример: через файлы .pth).
Обычно ответ, который я вижу, заключается в том, что мы должны сделать что-то подобное в командной строке windows cmd:
cd /d C:\Program Files\MyApp\myEnv\Scripts\ && activate
cd /d C:\Program Files\MyApp\ && python Main.py
Теперь, если вы загляните в activ.batch или Activate.ps1, вы увидите, что все, что они делают, это предполагают, что вы установили переменную PYTHONHOME
для своей среды Python, а затем настроили новые переменные env _OLD_VIRTUAL_PATH
, _OLD_VIRTUAL_PYTHONHOME
, VIRTUAL_ENV
и временно удалите переменную PYTHONHOME
.
Однако это все еще не говорит оболочке, как найти что-то вроде python.exe
. Когда я запускаю это, как в коде, предложенном выше, я получаю среду Python, которая не содержит ни одного из путей sys в оболочке, которые активировались бы при явном вызове:
cd / d C: \ Program Files \ MyApp \ myEnv \ Scripts \ && python.exe
Затем в полученной оболочке я вызываю:
импорт системы
sys.path
Этот тип делает с тех пор, потому что все, что сделал activate
, это изменило имя переменных среды, так что все еще совершенно логично, что просто вызов:
cd / d C: \ Program Files \ MyApp \ && python Main.py
находит python.exe
в _OLD_VIRTUAL_PYTHONHOME
(что совпадает с переменной PYTHONHOME
) вместо пути VIRTUAL_ENV
(что равно C:\Program Files\MyApp\myEnv\
). Я предполагаю, что это означает, что модули в пути 'VIRTUAL_ENV' будут обнаружены, но пути, добавленные в виртуальную среду, никогда не будут найдены, поскольку исполняемый файл для оболочки myEnv не вызывается.
Кто-нибудь знает, как с этим справиться?
РЕДАКТИРОВАТЬ 1
Как отмечено в комментариях, мне нужно уточнить. Файл .pth, упомянутый в вопросе, содержит только относительные пути, а не абсолютные. Как и в любой реальной ситуации доставки или развертывания, давайте предположим, что мы не знаем, где установлен этот виртуальный env, и поэтому вынуждены полагаться на использование путей относительно переменных env.