网站首页 文章专栏 python动态导入库模块
python动态导入库模块
创建于:2019-06-04 06:44:15 更新于:2021-10-16 04:06:28 羽瀚尘 267
python python

前言

最近在实现一个基于深度学习的数据扩增方法,为了测试多种方法,需要一个框架型的程序动态调用model。在这种需求下,框架代码就需要动态扫描models目录下的所有模型,并动态导入。

实例

可以使用python的import_module实现。

from importlib import import_module

MODELS_PATH = 'models'
# 扫描models目录
all_models = os.listdir(MODELS_PATH)
# 提取模型的名称,也就是文件名去除扩展名后剩下的部分
all_models_name = [os.path.splitext(filename)[0] for filename in all_models]
# 生成该模块的路径,如`models/mymodel.py`
all_models_path = [MODELS_PATH + '.' + model_name for model_name in all_models_name]
models = {}
for i in range(len(all_models_path)):
    # __init__.py是例外
    if all_models_name[i] != '__init__':
        # 直接导入,返回的model就是该模块
        model = import_module(all_models_path[i])
        # update_dict = {all_models_name[i]: model}
        # 保存模块名到字典,方便后续调用
    models[all_models_name[i]] = model
        # print('locals will update', update_dict)
        # locals().update(update_dict)

其他

在本例中,我们希望后续调用时可以直接通过models字典实现,否则调用不同的模型还需要用if else实现switch功能。如果是其他用途,可以用locals().update()方法。

该方法用于将字典的键值对填充到本地局部变量中,猜测是在模块,即单个文件作用域中有效。 以下代码可以快速理解该方法的功能:

settings = {'key1':'value1'}
locals.update(settings)
print(key1)

输出:

'value1'

可以看到,不会报value Error错误,而是输出了键值。