2010-05-26 35 views
16

使用__import__执行以下操作的最佳方法是什么,以便我可以动态指定模块?如何使用__import__导入*

from module import * 
+3

但是大家都知道,你应该避免使用'进口*'? – 2010-05-26 20:13:44

+8

不在这里进行语义学讲座:) – 2010-05-26 20:14:09

+0

你想在当地人吗?你不应该这样做,但迈克尔Mrozek的答案是完全错误的反正。伊格纳西奥的答案应该被接受。 – 2016-05-18 20:35:03

回答

5

这是同样作为一个正常的进口通话,你只要把它传递包含'*'fromlist列表:

moduleName = "foo" 
__import__(moduleName, globals(), locals(), ['*']) 
+0

这实际上并没有设置当地人(),这是我遇到的问题:) – 2010-05-26 20:16:16

+0

根据文档标准'__import__'甚至不使用'locals'参数。如果你重载'__builtin __.__ import__',你可以清楚地看到当你运行'from foo import *'时会发生什么,它看起来确实如此 – 2010-05-26 20:17:47

+0

它并没有实际导入属性,这是问题所在。它将它们加载到内存中,但它不会在当前模块locals()下设置它们。 – 2010-05-26 20:21:57

4

__import__()从不加添什么地方范围。您将必须通过返回的模块,根据需要访问其属性。

14

的唯一途径,我发现:

module = __import__(module, globals(), locals(), ['*']) 
for k in dir(module): 
    locals()[k] = getattr(module, k) 
+0

你为什么要这样做?我闻到糟糕的代码。 ||另一方面,随时接受你自己的答案。 – 2010-05-26 22:10:36

+5

因为这是解决问题的唯一方法。 – 2010-05-28 18:25:57

+0

这似乎是快速完成工作的最佳选择。我发现的另一个选项是:从%s import *'%moduleName; exec(cmd)“执行”cmd ='。每个人都会尖叫,但对于小脚本来说,这似乎是最好的方式。 – mathtick 2011-09-26 15:20:31