首页 > 解决方案 > 动态模块导入

问题描述

我有几个执行特定功能(数据解析、计算等)的自定义 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()

我希望这是有道理的,如果不只是评论的话,我可以根据需要进行澄清。

标签: pythonjsonimportmodule

解决方案


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()

推荐阅读