我花了很长时间才找到这个解决方案,所以我希望其他人也能看到它。
我想编写一个Python脚本来创建虚拟环境并在其中安装模块。不幸的是,pip与子进程不兼容,详见此处: https://github.com/pypa/pip/issues/610
我的答案已经在那个主题中了,但我想在下面详细说明。
我花了很长时间才找到这个解决方案,所以我希望其他人也能看到它。
我想编写一个Python脚本来创建虚拟环境并在其中安装模块。不幸的是,pip与子进程不兼容,详见此处: https://github.com/pypa/pip/issues/610
我的答案已经在那个主题中了,但我想在下面详细说明。
基本上,问题就是pip仍在使用最初调用的Python可执行文件。要修复此问题,您需要从传递的环境变量中删除它。以下是解决方案:
#!/usr/bin/python3
import os
import subprocess
python_env_var = {"_", "__PYVENV_LAUNCHER__"}
CMD_ENVIRONMENT = {name: value for (name, value) in os.environ.items()
if name not in python_env_var}
subprocess.call('./pip install -r requirements.txt', shell=True,
env=CMD_ENVIRONMENT)
已在Mac、Ubuntu 14.04和Windows上使用Python 3进行过测试。
类似的问题可能会在许多情况下容易存在——为了防止处理virtualenv时出现这种行为,我将从现在开始删除此变量。