Python3相对导入报错ImportError: no known parent package问题求解
Python相对导入报错原因及解决方案
报错根本原因
- 相对导入的逻辑依赖模块的包层级身份识别:Python执行相对导入时,会读取当前模块的
__name__属性判断其所在的包结构,只有当模块是作为包的一部分被导入、__name__包含完整包路径(你的场景下应为python.wsgi)时,.代表的父包层级才能被正确识别。 - 直接运行脚本会破坏包身份:当你直接执行
python wsgi.py时,wsgi.py会被识别为顶层入口脚本,它的__name__会被强制设置为__main__,Python无法判断它属于python包,自然找不到.对应的父包,就会抛出你遇到的错误。即便python目录下存在__init__.py属于合法包,也不影响这个判定逻辑。
为什么去掉点的绝对导入可以正常运行?
当你直接运行wsgi.py时,Python会自动将该脚本所在的目录(也就是你的python目录)加入sys.path搜索路径,main是python目录下的直属子包,直接from main import api属于从顶层包开始的绝对导入,能直接在sys.path下匹配到main包,所以可以正常运行。
保留相对导入的正确运行方式
如果不想修改导入语句,可以用模块模式运行脚本,不要直接执行脚本文件:
- 切换工作目录到
python文件夹的上一级目录 - 执行命令:
python -m python.wsgi
这种运行方式会将当前工作目录加入sys.path,wsgi.py会被识别为python包下的wsgi模块,__name__取值为python.wsgi,相对导入逻辑就能正常生效。
内容的提问来源于stack exchange,提问作者Pritam Bohra
相关产品推荐
相关产品推荐

