如何动态地从包中导出模块中的类?

时间:2010-08-26 18:57:02

标签: python import module

这可能很简单,但我不明白。以下作品:

foo.py

class Foo:
    pass

bar.py

module = __import__('foo')
foo = module.__dict__['Foo']

之后,foo正如所期望的那样是foo.Foo


然而,如果我将a.py放入包中,它就会停止工作:

qux / __初始化__。PY

(空档案)

qux / foo.py

class Foo:
    pass

bar.py

module = __import__('qux.foo')
foo = module.__dict__['Foo']

正在运行python bar.py会给我KeyError: 'Foo',但模块导入仍然成功。

发生了什么,我该如何让它发挥作用?

4 个答案:

答案 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