这可能很简单,但我不明白。以下作品:
class Foo:
pass
module = __import__('foo')
foo = module.__dict__['Foo']
之后,foo
正如所期望的那样是foo.Foo
。
然而,如果我将a.py
放入包中,它就会停止工作:
(空档案)
class Foo:
pass
module = __import__('qux.foo')
foo = module.__dict__['Foo']
正在运行python bar.py
会给我KeyError: 'Foo'
,但模块导入仍然成功。
发生了什么,我该如何让它发挥作用?
答案 0 :(得分:3)
__import__
返回顶层模块/包 - 这里是qux
。但是,所有模块都插入sys.modules
,因此您只需在其中查找qux.foo
。
参见__import__()
上的PyDoc -it所有描述的内容。
答案 1 :(得分:2)
如果要导入子模块,可以执行以下操作:
package = __import__('qux', fromlist=['foo'])
module = getattr(package, 'foo')
请注意,fromlist
__import__
会在第一个参数中返回嵌套最多的名称,因此您可以在baz.bar.qux
调用中替换__import__
来访问baz.bar.qux.foo
1}}模块。
答案 2 :(得分:1)
您需要使用fromlist参数来引用子模块:
temp = __import__('qux.foo', globals(), locals(), ['Foo'], -1)
foo = temp.Foo
答案 3 :(得分:1)
您可以使用importlib
:
import importlib
module_name="qux.foo"
mod=importlib.import_module(module_name)
有关详细信息,请参阅http://docs.python.org/dev/library/importlib.html。