python中的动态模块导入(代码从3.2到3.3)

时间:2013-02-07 10:23:59

标签: python windows python-3.x python-import python-module

我需要动态导入模块并创建一个类 这是我在Python 3.2中的工作代码:

klass = {}
mod = __import__('sites.' + self.className + '_login', fromlist=[self.className])
klass[self.className] = getattr(mod, self.className)
klass[self.className](**self.args)

该模块位于“sites”文件夹中。它被称为my_site_login,并且该模块中的类为“my_site”。

由于我升级到Python 3.3,代码停止工作。我读到_____import_____被importlib.import_module取代。我尝试了几种方法来做到这一点,但我无法让它发挥作用。

这就是我的尝试:
https://stackoverflow.com/a/8790051/1095101

mod = getattr(import_module('sites.' + self.className + '_login'), self.className)

我不记得我尝试了什么。我能说的是,在任何导入尝试之后,我没有显示任何print()。我没有收到任何错误消息。它只是注意到了。

对不起这个问题,我知道已经多次回答,但我尝试了一切,没有任何作用。我再也想不到了。 谢谢你提前。

1 个答案:

答案 0 :(得分:1)

你想重组这个;在sites__init__.py文件中,导入需要动态导入的所有模块。

然后只使用属性访问:

import sites

mod = getattr(sites, self.className + '_login')
klass[self.className] = getattr(mod, self.className)
klass[self.className](**self.args)

如果您的my_site_login.py模块是动态生成的,importlib.import_module()可调用的工作非常简单:

importlib

mod = importlib.import_module('sites.{}_login'.format(self.className))
klass[self.className] = getattr(mod, self.className)
klass[self.className](**self.args)

在交互式命令提示符下,这样可以正常工作:

>>> import importlib
>>> importlib.import_module('sites.my_site_login')
<module 'sites.my_site_login' from './sites/my_site_login.py'>

在Python 2.7,3.2和3.3中测试过。