网站首页 文章专栏 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错误,而是输出了键值。