You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同名文件与目录场景下如何用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()

方案二:调整导入规则(需修改目录结构)

  1. 在Config目录下添加空的__init__.py文件,让Python将其识别为合法包。
  2. 强制使用相对导入(需将VTE根目录也标记为包,即添加__init__.py):
    import importlib
    # 通过相对导入指定包路径
    Module_Instance = importlib.import_module(".Config.Test", package="__main__")
    
    该方法需要调整目录结构,灵活性不如方案一。

注意事项

  • 方案一中加载的模块,可直接调用其中的类、函数、变量,用法与常规导入的模块完全一致。
  • 若需重复加载该模块,可自行实现模块缓存逻辑,避免重复读取文件和执行代码。

内容的提问来源于stack exchange,提问作者NumeroUnoDE

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:37:21