我想在main函数中根据传递给Python脚本的参数选择要导入的模块。所以,我使用的是
blah = importlib.import_module("blah1")
blah = importlib.import_module("blah2")
其中“blahX”是同一接口的不同实现。
我还希望使用multiprocessing
模块将工作传递给不同的进程。
blah = None
def f(a, b):
print blah.f(a,b)
if __name__ == '__main__':
# call importlib.import_module here...
a = 1
b = 2
p = multiprocessing.Process(target=f, args=(a, b))
p.start()
p.join()
问题是传递给multiprocessing.Process
的函数不知道我在main中导入的模块。这与我使用import
时的情况不同
import blah1 as blah
#import blah2 as blah
但是之后我就失去了在运行时选择模块的能力。
我如何修复这个设计?
发布于 2013-07-06 14:51:45
当您调用mp.Process(...)
时,多处理模块会派生一个子进程(在Unix上),或者启动一个新的Python进程并导入调用模块(在Windows上)。在Unix上,您当前的代码可以工作,因为fork时的所有全局变量都会被新的子进程复制。
但是,在Windows上,调用模块是导入的。由于blah的定义,例如,
blah = importlib.import_module("math")
在内部受到保护
if __name__ == '__main__':
blah
的新定义不会转移到子流程。
因此,要使其在Windows中工作,您可以将模块的名称传递给目标函数,并在目标函数中调用importlib.import_module
:
import importlib
import multiprocessing as mp
blah = None
def f(a, b, name):
blah = importlib.import_module(name)
print blah.hypot(a,b)
if __name__ == '__main__':
a = 1
b = 2
p = mp.Process(target=f, args=(a, b, "math"))
p.start()
p.join()
https://stackoverflow.com/questions/17503909
复制