已存在__init__.py文件仍触发ModuleNotFoundError的原因是什么?
报错根本原因
这是Python绝对导入规则和包模块搜索逻辑共同导致的问题,具体触发逻辑如下:
- 你当前存放代码的目录因为存在
__init__.py,属于合法的Python包,结构如下:
父目录/ └── 你的包目录/ ├── __init__.py ├── p.py ├── s.py ├── c.py └── d.py
- 运行p.py作为入口脚本时,导入链路触发了包的
__init__.py执行,后续s.py是作为包的子模块被导入的,对应全模块名为你的包名.s。此时在s.py中写from d import D属于绝对导入,Python只会到sys.path的所有路径下搜索顶层名为d的模块,不会自动搜索同包下的d.py - 此时
d.py的全模块名为你的包名.d,不存在顶层d模块,因此触发ModuleNotFoundError
附加潜在问题
你给出的s.py代码中,from d import D写在了class S的定义缩进块内,不符合Python语法规范,即使导入问题修复后也会触发语法错误,需要把导入语句移到文件顶部。
修复方案
两种方案二选一即可:
- 将
s.py里的导入改为相对导入:from .d import D,明确指定导入同包下的d模块 - 在p.py最顶部添加代码,手动把包目录加入Python搜索路径:
import sys, os sys.path.append(os.path.dirname(os.path.abspath(__file__)))
内容的提问来源于stack exchange,提问作者Ashwin
相关产品推荐
相关产品推荐

