Python相对导入报超出顶级包错误时如何正确导入目标模块
报错成因
触发attempted relative import beyond top-level package报错的核心原因:
- Python的相对导入(带
.的导入语句)是基于当前模块的包嵌套层级计算跳转位置的,你写的...代表向上找3层父目录。如果你直接运行Dal.py文件,Python会把Dal.py所在的OtherFold文件夹当成最顶层的包根,此时当前模块最多只能向上跳1层到DalFolder,跳3层直接超出了顶层包的范围,自然报错。 - 就算层级数算对了,只要你是直接跑子目录里的脚本,项目根目录
projectfolder默认不会被加到Python的模块搜索路径里,跨同级文件夹的导入也找不到目标文件。
正确导入方法
推荐用兼容性最好的绝对导入方案,不管你怎么启动脚本都不会出路径问题:
在Dal.py的最开头加路径处理代码,把项目根目录加到Python的搜索路径里,再写导入语句:
import sys from pathlib import Path # 按当前文件位置往上回溯3层,刚好到projectfolder根目录 # 层级对应:当前Dal.py → 父目录OtherFold → 父目录DalFolder → 父目录projectfolder root_path = Path(__file__).parent.parent.parent.resolve() sys.path.append(str(root_path)) # 直接导入目标类即可,不建议用import *全量导入,容易出现变量名冲突 from ConfigFolder.Config import MyClass
如果一定要用相对导入,需要先做包结构配置:
- 给每个涉及导入的文件夹加空的
__init__.py文件,让Python把这些文件夹识别为合法包:ConfigFolder目录下新建空的__init__.pyDalFolder目录下新建空的__init__.pyDalFolder/OtherFold目录下新建空的__init__.py
- 启动的时候不能直接进
OtherFold跑python Dal.py,要切到projectfolder的上一级目录,用模块模式启动:
python -m projectfolder.DalFolder.OtherFold.Dal
这种场景下你原来写的from ...ConfigFolder.Config import *可以正常运行,但对启动位置要求很高,本地调试灵活度差,一般不推荐。
内容的提问来源于stack exchange,提问作者Arie
相关产品推荐
相关产品推荐

