【发布时间】:2019-01-06 22:14:28
【问题描述】:
简单地说:
我如何保证使用的是我的 virtualenv 而不是本机 env?
其他答案的问题: 我已经看到这个问题得到了很多回答,但答案很简洁,基本上只是涵盖了虚拟环境的“即插即用”场景。
我的场景: 让我们假设一个足够复杂的文件夹中的虚拟 Python 环境(myEnv)和运行它的机器足够复杂(targetEnv)。让我们假设 virtualenv (myEnv) 中有很多自定义项,并且该 virtualenv 中的 evn 变量以我们不知道的方式进行了修改(例如:通过 .pth 文件)。
通常我看到的答案是我们应该在 windows cmd 提示符下做这样的事情:
cd /d C:\Program Files\MyApp\myEnv\Scripts\ && activate
cd /d C:\Program Files\MyApp\ && python Main.py
现在,如果您查看 activate.batch 或 Activate.ps1,您会看到它们所做的只是假设您已经为您的原生 python 环境设置了一个 PYTHONHOME 变量,然后设置了新的 env 变量 _OLD_VIRTUAL_PATH 、_OLD_VIRTUAL_PYTHONHOME、VIRTUAL_ENV,并暂时删除 PYTHONHOME 变量。
但是这仍然没有告诉 shell 如何找到像 python.exe 这样的东西。当我像上面建议的代码一样运行它时,我得到一个 python 环境,它不包含 shell 中的任何 sys 路径,如果显式调用这些路径将被激活:
cd /d C:\Program Files\MyApp\myEnv\Scripts\ && python.exe
然后在生成的 shell 中我调用: 导入系统 系统路径
因为所有activate 所做的只是更改环境变量的名称,所以这种做法仍然是完全合乎逻辑的,只需调用:
cd /d C:\Program Files\MyApp\ && python Main.py
在_OLD_VIRTUAL_PYTHONHOME(与PYTHONHOME 变量相同)而不是VIRTUAL_ENV(等于C:\Program Files\MyApp\myEnv\)路径中找到python.exe。我想这意味着可以发现“VIRTUAL_ENV”路径中的模块,但是永远不会搜索添加到虚拟环境的路径,因为不会调用 myEnv shell 的可执行文件。
有人知道如何解决这个问题吗?
编辑 1
正如我需要澄清的 cmets 中所述。问题中提到的 .pth 文件仅包含相对路径,而不包含绝对路径。在任何实际的运输或部署情况下,假设我们不知道这个虚拟环境的安装位置,因此必须依赖使用相对于环境变量的路径。
【问题讨论】:
-
你不能直接使用 python 可执行文件的路径吗?
cd C:\Program Files\MyApp\ && C:\Program Files\MyApp\myEnv\python.exe Main.py。至少这是我在 Linux/MacOS 上在 shell 脚本中使用 venv 时会做的事情。 -
我实际上刚刚测试过,仍然没有提取 virtualenv 中的 .pth 文件
-
无法复制;在 Windows 10 VM 上的 virtualenv 中对其进行测试,当使用 venv 的 python 可执行文件的绝对路径时,站点包中的 pth 文件会正确应用。你能编辑你的问题,为问题添加minimal reproducible example吗?
-
啊,.pth 包含安装 virtualenv 的相对路径。在这种情况下,不可能知道绝对路径并将其放在 .pth 中。还有自我挫败,我想,如果有人知道绝对路径,为什么还要使用环境变量?
-
您将 pth 文件放在哪里?是 venv 根目录(例如
C:\Program Files\MyApp\myEnv)吗?
标签: python windows virtualenv