在运行时导入模块

时间:2013-10-07 09:05:18

标签: python python-import

我正在尝试使用__import__()导入模块。我需要使用__import__因为我不知道在运行之前我需要哪个模块。

假设我需要的模块是MyClass。文件树为api/apps/myapp/my_class.py,我在my_class.py中的类为MyClass。现在,要访问MyClass的方法,我正在做的是:

my_class_module =  __import__('api.apps.myapp.my_class')
my_class= my_class_module.MyClass()

但是我收到了这个错误: 'module' object has no attribute 'MyClass'

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

默认情况下,__import__会返回对第一个模块的引用。在您的示例中,它是api。解决方案是使用fromlist参数:

my_class_module =  __import__('api.apps.myapp.my_class', fromlist=[''])

来自__import__文档:

[...] 从包中导入模块时,请注意 ___ import ___('A.B',...) 当fromlist为空时返回包A,但其子模块B何时返回 fromlist不是空的。 [...]

有关其原因的详细信息,请参阅Why does Python's __import__ require fromlist?