在Python multiprocessing.Process中设置env var

在Python multiprocessing.Process中设置env var,python,environment-variables,multiprocessing,Python,Environment Variables,Multiprocessing,在Python2模块中,可以给一个env 似乎在模块中执行此操作的等效方法是在args或kwargs中传递env字典,然后在目标中使用os.environ['FOO']=value 这条路对吗 安全吗?我的意思是,不存在可以修改父进程或其他子进程中的环境的风险 下面是一个(有效的)例子 是的,这是正确的方法。虽然子级将从父级继承其初始环境,但在子级中对os.environ所做的后续更改不会影响父级,反之亦然: import os import multiprocessing def myfu

在Python2模块中,可以给一个
env

似乎在模块中执行此操作的等效方法是在
args
kwargs
中传递
env
字典,然后在
目标中使用
os.environ['FOO']=value

这条路对吗

安全吗?我的意思是,不存在可以修改父进程或其他子进程中的环境的风险

下面是一个(有效的)例子


是的,这是正确的方法。虽然子级将从父级继承其初始环境,但在子级中对
os.environ
所做的后续更改不会影响父级,反之亦然:

import os
import multiprocessing


def myfunc(q):
    print "child: " + os.environ['FOO']
    os.environ['FOO'] = "child_set"
    print "child new: " + os.environ['FOO']
    q.put(None)
    q.get()
    print "child new2: " + os.environ['FOO']


if __name__ == "__main__":
    os.environ['FOO'] = 'parent_set'
    q = multiprocessing.Queue()
    proc = multiprocessing.Process(target=myfunc, args=(q,))
    proc.start()
    q.get()
    print "parent: " + os.environ['FOO']
    os.environ['FOO'] = "parent_set_again"
    q.put(None)
输出:

child start: parent_set
child after changing: child_set
parent after child changing: parent_set
child after parent changing: child_set
foo0
foo1
foo2
foo
如果需要将初始环境传递给孩子,只需在
args
kwargs
列表中传递即可:

def myfunc(env=None):
    time.sleep(3)
    if env is not None:
        os.environ = env
    print os.environ['FOO']


if __name__ == "__main__":
    child_env = os.environ.copy()

    for i in range(3):
        child_env['FOO'] = "foo%s" % (i,)
        proc = multiprocessing.Process(target=myfunc, kwargs ={'env' : child_env})
        proc.start()
输出:

child start: parent_set
child after changing: child_set
parent after child changing: parent_set
child after parent changing: child_set
foo0
foo1
foo2
foo
请注意,如果使用的是
多处理.Pool
,则可以使用
初始值设定项
/
initargs
关键字参数,在池中每个进程开始时只设置一次正确的环境:

def init(env):
    os.environ = env

def myfunc():
    print os.environ['FOO']


if __name__ == "__main__":
    child_env = os.environ.copy()
    child_env['FOO'] = "foo"
    pool = multiprocessing.Pool(initializer=init, initargs=(child_env,))
    pool.apply(myfunc,()) 
输出:

child start: parent_set
child after changing: child_set
parent after child changing: parent_set
child after parent changing: child_set
foo0
foo1
foo2
foo

推迟几个月投票。我只是问了同样的问题。