繁体   English   中英

Python multiprocessing.process使用virtualenv

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM