Python相对导入需在包内以-m方式运行,用点号向上回溯层级,如from .. import module_a;常见错误包括直接运行模块导致__package__为None,或点数超出包层级。
Python相对导入用于在包内部模块之间引用其他模块,写法简单但容易出错。关键在于
必须在包内运行
,且导入语句要以点(
)开头,点的数量表示向上回溯的层级。
相对导入的基本写法
假设项目结构如下:
在
中想导入同级的
,不能写
(这是绝对导入,会报错),而应写:
(向上两级到
,再导入
)
(从
导入具体对象)
(导入同级子模块,如
)
常见错误:ModuleNotFoundError: No module named '__main__'
这个错误通常发生在你直接运行包内的模块,比如
。此时 Python 把它当作顶层脚本(
),不认为它属于任何包,相对导入就失效了。
立即学习
“
Python免费学习笔记(深入)
”;
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
✅ 正确做法:用
参数以模块方式运行,例如:
✅ 确保所有中间目录都有
(哪怕为空)
❌ 不要双击运行或直接
常见错误:“Attempted relative import beyond top-level package”
意思是相对导入“爬”出了包的最顶层。比如在
里写
,但
已经是顶层了,再往上没有包。
检查点号数量是否过多:一个
是同级,两个
是父级,三个
是祖父级……不能超过实际包嵌套层数
确认当前模块所属的包名:打印
可查看当前模块被识别为哪个包下的模块
如果
是
,说明没被当包加载,相对导入一定失败
调试小技巧
遇到相对导入问题时,快速定位原因:
在模块开头加两行:
运行时看输出:若
是
或空字符串,说明没走包加载流程
用
查看详细导入过程(会输出每一步尝试的路径)
避免在脚本中混用相对导入和直接执行;测试阶段可改用绝对导入+修改
临时绕过
相对导入本身不复杂,但对运行上下文敏感。只要记住“必须用
运行、包结构完整、点数不越界”,就能避开绝大多数坑。
.myproject/
├── __init__.py
├── main.py
└── package/
├── __init__.py
├── module_a.py
└── subpackage/
├── __init__.py
└── module_b.py
module_b.pymodule_a.pyimport module_afrom .. import module_apackagemodule_afrom ..module_a import some_funcmodule_afrom . import utilssubpackage/utils.pypython package/subpackage/module_b.py__name__ == '__main__'-mpython -m package.subpackage.module_b__init__.pypython xxx.pypackage/__init__.pyfrom .. import somethingpackage......print(__package__) __package__Noneprint(__name__); print(__package__)__package__Nonepython -vsys.path-m