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

Posted

技术标签:

【中文标题】python中的动态模块导入(代码从3.2到3.3)【英文标题】:Dynamic module import in python (code from 3.2 to 3.3) 【发布时间】:2013-01-22 19:31:44 【问题描述】:

我需要动态导入一个模块并创建一个类。 这是我在 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)

该模块位于“站点”文件夹中。它被称为 my_site_login 和该模块中的类“my_site”。

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

这是我试过的:https://***.com/a/8790051/1095101

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

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

抱歉这个问题,我知道它已经回答了好几次,但我尝试了一切,但没有任何效果。我简直不能再想了。 提前致谢。

【问题讨论】:

【参考方案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 中进行了测试。

【讨论】:

好吧...这很尴尬。由于您的代码正是我正在尝试的,所以有些不对劲。问题出在模块的新文档字符串中。没有 utf-8 声明,有些字符搞砸了一切。无论如何,我将使用您的第二个代码,正如您猜测的那样,它们是动态生成的。谢谢。

以上是关于python中的动态模块导入(代码从3.2到3.3)的主要内容,如果未能解决你的问题,请参考以下文章

LayaBox---TypeScript---模块

python | 模块和库

动态导入在运行时从编译输出中指定的模块

Python从菜鸟到高手:导入Python模块

Python界面设计——GUI编程之PyQt5

从模块中动态导入所有内容 ( * )