同名文件与目录场景下如何用importlib加载指定模块?
解决方法
原因分析
根目录的Config.py与Config目录重名,Python导入模块时会优先匹配同名的.py文件,而Config.py不是包,因此无法导入其子模块Config.Test。
方案一:直接从文件加载模块(推荐,无需修改现有文件结构)
使用importlib.util模块直接从指定文件加载模块,绕过Python的包导入优先级限制:
import os import importlib.util Module = "Config::Test" # 转换为目标文件的绝对路径 module_path = os.path.join(os.getcwd(), Module.replace('::', '/') + '.py') if not os.path.exists(module_path): print(f"[ ERROR ] The Specified Module '{Module}' Could Not Be Found !") else: # 创建模块的规格对象 spec = importlib.util.spec_from_file_location("Config.Test", module_path) # 根据规格创建模块实例 Module_Instance = importlib.util.module_from_spec(spec) # 执行模块代码完成加载 spec.loader.exec_module(Module_Instance) # 示例:调用模块中的内容(假设Test.py内有test_func函数) # Module_Instance.test_func()
方案二:调整导入规则(需修改目录结构)
- 在
Config目录下添加空的__init__.py文件,让Python将其识别为合法包。 - 强制使用相对导入(需将VTE根目录也标记为包,即添加
__init__.py):
该方法需要调整目录结构,灵活性不如方案一。import importlib # 通过相对导入指定包路径 Module_Instance = importlib.import_module(".Config.Test", package="__main__")
注意事项
- 方案一中加载的模块,可直接调用其中的类、函数、变量,用法与常规导入的模块完全一致。
- 若需重复加载该模块,可自行实现模块缓存逻辑,避免重复读取文件和执行代码。
内容的提问来源于stack exchange,提问作者NumeroUnoDE
相关产品推荐
相关产品推荐

