在Python multiprocessing.Process中设置env var
在Python2模块中,可以给一个在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
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
推迟几个月投票。我只是问了同样的问题。