本文由腾讯云+社区自动同步,原文地址 http://blogtest.stackoverflow.club/article/python_import_dynamic/
最近在实现一个基于深度学习的数据扩增方法,为了测试多种方法,需要一个框架型的程序动态调用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错误,而是输出了键值。