使用importlib.import_module动态导入模块后无法后续调用函数的问题求助
你遇到的问题本质是动态导入的模块没有被持久存储到可全局访问的变量中:循环内部的var_str_file是临时变量,每次循环都会被覆盖,循环结束后你没有保留任何对导入模块的引用,自然无法在后续代码中直接通过模块名调用函数。
方法1:用全局字典存储导入的模块(更安全,推荐)
提前定义一个空字典存储所有导入的模块,后续需要调用时从字典取值即可:
import importlib import logging import sys # 提前把模块所在的目录加入Python搜索路径,避免导入失败 sys.path.append("你的sfm_*.py文件所在的目录绝对/相对路径") # 定义空字典存储导入的模块 loaded_sfm_modules = {} for var_str_file in var_lst_files: try: if 'sfm_' in var_str_file: module_name = var_str_file.replace('.py', '') logging.info(' %s' % module_name) # 导入模块并存入字典 imported_module = importlib.import_module(module_name) loaded_sfm_modules[module_name] = imported_module # 循环内的调用逻辑不变 var_str_topic, var_str_message, var_str_retain = imported_module.main() do_publish(var_str_topic, var_str_message, var_str_retain) logging.info('') except Exception as var_str_exception: logging.error('Exception Occurred', exc_info=True) logging.info('') # 后续调用直接从字典取即可 var_str_topic, var_str_message, var_str_retain = loaded_sfm_modules['sfm_process_host_name'].main() do_publish(var_str_topic, var_str_message, var_str_retain)
方法2:将模块注入全局命名空间(适配原有调用写法)
如果你需要保持sfm_process_host_name.main()这种调用写法,可以把导入的模块直接加入全局变量字典:
# 循环内导入时替换为这段代码 module_name = var_str_file.replace('.py', '') imported_module = importlib.import_module(module_name) # 注入全局命名空间 globals()[module_name] = imported_module
注入完成后你原来写的sfm_process_host_name.main()就可以正常运行了。
注意事项
- 确保所有待导入的
sfm_*.py文件所在的目录已经加入sys.path,否则会出现模块找不到的报错 - 优先推荐方法1,全局字典的方式不会污染现有全局变量,也能避免模块名和已有变量重名导致的覆盖问题
内容的提问来源于stack exchange,提问作者Werner Venter
相关产品推荐
相关产品推荐

