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
相关产品推荐
相关产品推荐

