我正在尝试使用子进程中的call()运行名为env的virtualenv(之前创建),但是它不起作用。命令很好,当我直接在终端中键入命令时,它就可以工作。
python代码:
import subprocess
subprocess.call("source env/bin/activate", shell=True)
我也在尝试:
import os
os.system("source env/bin/activate")
为什么不执行命令或我应该使用什么来代替os.system()和subprocess.call()?
答案 0 :(得分:1)
在两个示例中,您的代码都会启动一个子进程。该子进程具有自己的环境,它尝试运行“ source”命令,然后退出。由于子流程具有自己的环境,因此对当前流程没有影响。
假设最终目标是在子进程中运行其他命令,则应直接运行它。您不需要专门激活虚拟环境。
subprocess.call(["./env/bin/pip", "list"])
尽可能避免使用shell=True
选项;如果您不十分小心,可能会非常危险。
如果确实需要设置activate
脚本在此脚本中设置的环境变量,则需要在os.environ
中手动设置它们。您可以阅读activate
脚本来查看它们是什么。不过,它们通常无关紧要。