【问题标题】:Dynamic module importing动态模块导入
【发布时间】:2018-08-14 19:30:11
【问题描述】:

我有几个执行特定功能(数据解析、计算等)的自定义 python 模块。然后我有描述模块的 json 配置(即模块名称、参数、函数等......)。最后,我正在创建一个我想要驱动这些模块的驱动程序脚本。配置或多或少会传递给驱动程序,该驱动程序命令模块根据此配置运行某些功能。我想做的是基于这些配置我想动态导入这些模块并运行基于配置提供的测试列表。配置的数量可以是从 1 到 N 的任何地方。测试列表要么是硬编码的,因为模块是基于模板创建的,要么是通过配置提供的。

即 json文件:

{ <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 是 key。这样我就可以遍历我的键,并调用这些模块的标准函数。

即它应该像这样运行......

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

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

【问题讨论】:

  • 如果每个脚本都没有像if __name__ == '__main__' 这样的东西,难道不是每个脚本都在导入时执行吗?
  • import_module() 返回一个模块对象,那么mod = importlib.import_module(itm) 有什么问题,然后使用mod.func(...) 调用您喜欢的模块的任何函数?

标签: python json import module


【解决方案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) 

然后你可以用它来调用一个函数:

for mod in dynamods
    dynamods[mod].execute()

【讨论】:

    猜你喜欢
    • 2020-07-25
    • 2011-04-17
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多