动态模块导入

时间:2018-08-14 19:30:11

标签: python json import module

我有几个自定义的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>

其中模块为itm,模块名称为键。这样,我就可以遍历所有密钥,并调用这些模块的标准功能。

即它应该像这样...

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

我希望这是有道理的,即使不仅仅是评论,我也可以根据需要进行澄清。

1 个答案:

答案 0 :(得分:2)

C1:1返回对导入的模块对象的引用,您只需创建一个新变量并将其存储即可访问成员:

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)