python - 动态模块导入
问题描述
我有几个执行特定功能(数据解析、计算等)的自定义 python 模块。然后我有描述模块的 json 配置(即模块名称、参数、函数等)。最后,我正在创建一个我想要驱动这些模块的驱动程序脚本。配置或多或少会传递给驱动程序,该驱动程序命令模块根据此配置运行某些功能。我想做的是基于这些配置,我想动态导入这些模块并运行基于配置提供的测试列表。配置的数量可以是从 1 到 N 的任意数量。测试列表要么是硬编码的,因为模块是基于模板创建的,要么是通过配置提供的。
即JsonFile:
{ <module_name>: {
kw:<module>,
kw:<arg1>,
kw:<argN>
}
}
代码:
<parse json code>
for key,val in jsonCfg.items():
lst.append(key)
for dctKey, itm in val.items():
if 'IMPORT' in dctkey:
importlib.import_module(itm)
这是我到目前为止所拥有的基础知识......我现在陷入了如何命令python调用该模块代码的问题。我希望有类似标准进口的东西......
import <module> as <module_name>
其中 module 将是 itm 并且 module_name 将是关键。通过这种方式,我可以尽可能多地遍历我的键并调用这些模块的标准函数。
即它应该像这样运行......
import moduleX as MX
MX.execute
import moduleY as MY
MY.execute
但被编码为......(伪代码)
<parse json code>
for key,val in jsonCfg.items():
lst.append(key)
for dctKey, itm in val.items():
if 'IMPORT' in dctkey:
importlib.import_module(itm) as key
for mod in lst.items()
mod.execute()
我希望这是有道理的,如果不只是评论的话,我可以根据需要进行澄清。
解决方案
importlib.import_module
返回导入模块对象的引用,您只需创建一个新变量并将其存储即可访问成员:
x = importlib.import_module(module_name)
x.some_func()
如果您有多个名称,您可以将导入的模块存储在某种结构、列表或字典中,只要对您有意义:
dynamods = {}
for key, val in jsonCfg.items():
for dctKey, itm in val.items():
if 'IMPORT' in dctkey:
dynamods[key] = importlib.import_module(itm)
然后你可以用它来调用一个函数:
for mod in dynamods
dynamods[mod].execute()
推荐阅读
- git - 检测 git branch 只触及特定路径
- microsoft-graph-api - Microsoft Graph OneNote Patch API 删除补丁后的图像
- puppeteer - 如何将 Chrome 添加到容器以克服 circleCI 中的错误“无法启动 chrome”
- react-native - VS Code 实时分享反应原生?
- c++ - 为什么使用多重继承时我的 Hippomock 期望失败
- python - AttributeError:模块“tensorflow”没有属性“assign”
- tensorflow - LSTM 层输出大小与 KERAS 中的隐藏状态大小
- php - foreach 中未定义的属性,除非 print_r'd
- php - .htaccess FilesMatch 以阻止 php 执行名称包含大写字母的 php 文件
- cassandra - 增加 roles_validity_in_ms 和 permissions_validity_in_ms 的影响