首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用importlib选择一个模块并在多处理函数中使用

使用importlib选择一个模块并在多处理函数中使用
EN

Stack Overflow用户
提问于 2013-07-06 22:31:34
回答 1查看 714关注 0票数 2

我想在main函数中根据传递给Python脚本的参数选择要导入的模块。所以,我使用的是

代码语言:javascript
代码运行次数:0
运行
复制
blah = importlib.import_module("blah1")
blah = importlib.import_module("blah2")

其中“blahX”是同一接口的不同实现。

我还希望使用multiprocessing模块将工作传递给不同的进程。

代码语言:javascript
代码运行次数:0
运行
复制
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时的情况不同

代码语言:javascript
代码运行次数:0
运行
复制
import blah1 as blah
#import blah2 as blah

但是之后我就失去了在运行时选择模块的能力。

我如何修复这个设计?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-06 22:51:45

当您调用mp.Process(...)时,多处理模块会派生一个子进程(在Unix上),或者启动一个新的Python进程并导入调用模块(在Windows上)。在Unix上,您当前的代码可以工作,因为fork时的所有全局变量都会被新的子进程复制。

但是,在Windows上,调用模块是导入的。由于blah的定义,例如,

代码语言:javascript
代码运行次数:0
运行
复制
blah = importlib.import_module("math")

在内部受到保护

代码语言:javascript
代码运行次数:0
运行
复制
if __name__ == '__main__':

blah的新定义不会转移到子流程。

因此,要使其在Windows中工作,您可以将模块的名称传递给目标函数,并在目标函数中调用importlib.import_module

代码语言:javascript
代码运行次数:0
运行
复制
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()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17503909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档