[英]Python multiprocessing.Process to use virtualenv
我正在使用virtualenv运行程序。 但是默认情况下,这里产生的multiprocessing.Process使用系统python。 我如何强制它使用virtualenv python。
import os
from multiprocessing import Process
def function1():
# do_something_here
p = Process(func2(), args=(param,))
p.start()
return something
def func2(param):
os.system("which python")
在这里打印“ / usr / bin / python”。 但是我需要它来使用virtualenv python。
使用sudo venv/bin/python
,您可以直接在virtualenv中使用python可执行文件有效地激活virtualenv 。
multiprocessing.Process
使用fork()
生成子进程,而没有exec()
,它使用与父进程完全相同的python可执行文件。
您可以通过以下方式确认正在使用的python可执行文件:
>>> import sys
>>> print(sys.executable)
/Users/georgexsh/workspace/tmp/venv/bin/python
>>> print(sys.exec_prefix)
/Users/georgexsh/workspace/tmp/venv/bin/..
不要使用which
来确定正在运行的python可执行文件路径。 which
,作为bash命令,搜索的每个元素$PATH
,含有名为“蟒蛇”的可执行文件的目录,如您直接使用的virtualenv的蟒蛇,而不是先运行它的壳激活脚本, $PATH
没有得到修补用的virtualenv的,结果,shell命令which python
将输出系统python可执行文件的路径。
实际上,在python层上, $PATH
是无关紧要的,修补$PATH
是为了在Bash层上方便起见,只需键入“ python”而不是输入完整路径即可在virtualenv路径中调用python可执行文件,最重要的是python可执行文件被调用,但不被调用。
您的问题在这里(复制了您的评论):
@georgexsh我正在使用sudo运行它。 默认情况下,如果您使用sudo,它将使用系统python。 因此,我使用了“ sudo venv / bin / python main.py”来运行程序。 即使我在这里使用venv的python,它也会为“ os.system('哪个python')”返回“ / usr / bin / python”。 我不明白这种行为
基本上,您在这里解释的是您的virtualenv未处于活动状态的情况。
当您激活virtualenv (. venv/bin/activate)
,激活脚本将更改您的环境,以便您的PYTHONPATH
是正确的,并且首先在虚拟env目录中搜索(找到)Python可执行文件。 这就是virtualenv所做的。
通过仅从virtualenv目录执行Python二进制文件,不会为虚拟环境设置您的环境,因此对Python的任何后续调用都将使用您的默认路径-因为virtualenv不会覆盖它。
当您执行sudo时,将创建一个新的进程/ shell,并且不会继承您的虚拟环境。 您也许可以使用sudo -E
传递环境,但这取决于您的sudo。 在每种环境中均应使用的防弹版本是执行一个外壳程序,该外壳程序首先激活virtualenv,然后执行您的脚本。 像这样:
sudo -- bash -c ". /home/test/mytest/bin/activate; which python"
这将以root用户身份执行bash shell,然后激活虚拟环境,并最终告诉您它使用的是哪个python。 只需使用您的虚拟环境路径修改以上命令,它甚至可能起作用。
如果您的系统是共享的,则请记住,从安全角度来看,让常规用户这样做是一件可怕的事情。 如果您为普通用户创建一个无密码的sudo来执行此操作,它将为他们提供root用户访问权限,而无需进行任何调整。 如果这是您自己的系统,并且无论如何都要求具备root密码知识,那就没关系了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.