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

Python报ModuleNotFoundError找不到同目录模块问题排查

问题根因

直接运行根目录下的run.py时,Python会自动把run.py所在的project/目录加入模块搜索路径sys.path的最高优先级,所有不带包前缀的顶级绝对导入,都会从这些搜索路径的根目录开始查找。
你在datasetA.py中写的from config import classes属于顶级绝对导入,Python会直接在project/目录下找名为config的模块,但config.py实际存放在datasets/子目录中,不在搜索路径的根层级,自然会抛出ModuleNotFoundError。

你观察到的属性现象完全正常:

  • datasetA的__package__值为datasets,仅代表它属于datasets包,但你用的是顶级绝对导入语法,Python不会主动在当前包范围内搜索目标模块,自然识别不到同包的config。
  • run.py作为直接运行的入口脚本,__package__值为None是Python的默认行为,不属于异常。

你之前尝试的相对导入方案没生效,核心是写法或使用位置不对:单独写import .config仅能导入同包的config模块本身,无法直接导入classes属性;如果把相对导入写在入口脚本run.py里,还会因为入口脚本不属于包结构直接报错。往__init__.py里乱加导入语句不仅解决不了问题,还容易触发循环导入故障。

可行解决方法

二选一即可,不需要额外修改__init__.py,保持文件为空就能正常运行:

  • 方案1:使用规范的包内相对导入(推荐,符合Python包设计规范)
    修改datasets/datasetA.py中的导入语句,用.指代当前包路径:
    # datasets/datasetA.py 内容
    from .config import classes
    dosomething()
    
  • 方案2:使用全路径绝对导入
    如果不习惯相对导入,就写完整的包路径,让Python能从顶级搜索路径定位到模块:
    # datasets/datasetA.py 内容
    from datasets.config import classes
    dosomething()
    
    注意用这个方案时,运行run.py的工作目录必须是project/根目录(也就是datasets文件夹的父目录),否则Python找不到顶级包datasets同样会报错。

避坑提示:不要为了解决导入问题随便往sys.path里插入子目录路径,也不要在__init__.py中添加非必要的导入逻辑,很容易引发重复加载、循环导入等难以排查的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:57:27