0

我需要动态导入一个模块并创建一个类。
这是我在 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()我在任何导入尝试后立即放置的所有内容都没有显示出来。我没有收到任何错误消息。它什么也不做。

4

1 回答 1

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 中进行了测试。

于 2013-02-07T10:27:15.070 回答