绝对导入以sys.path为起点,支持所有执行方式且推荐使用;相对导入仅限包内、以当前模块位置为基准,必须通过python -m运行,否则报错。

Python 的导入机制里,绝对导入和相对导入的核心区别在于:路径起点不同。绝对导入从 sys.path 中的路径(含当前工作目录、已安装包路径等)开始查找模块;相对导入只在当前包内部进行,且必须出现在包内的模块中,不能用于顶层脚本。
绝对导入:清晰、推荐、适用于所有场景
以 Python 安装环境或项目根目录为起点,用完整包路径导入。只要模块在 sys.path 中可发现,就能成功导入。
- 写法示例:
import requests、from mypackage.submodule import helper、from . import config(⚠️注意:这个看似是点号开头,但它是相对导入,不是绝对导入) - 支持脚本直接运行(如
python main.py),也支持作为模块执行(python -m mypackage.main) - 可读性强,路径明确,协作和维护更安全
- 推荐在所有项目中优先使用,尤其是公开库或团队项目
相对导入:限定包内、需满足执行方式、易出错
用点号(.、..、...)表示相对于当前模块所在包的位置。它不依赖 sys.path,只在包结构内解析,且仅在模块被当作包的一部分导入时才有效。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 写法示例:
from . import utils(同级模块)、from ..config import DB_URL(上一级)、from .subpkg import models -
不能直接运行:如果用
python module.py执行含相对导入的文件,会报ImportError: attempted relative import with no known parent package - 必须通过
python -m方式运行,且当前目录需在包外(即不能在包目录内执行) - 常见误用:把包当作普通脚本运行,或在
__main__.py中写相对导入却未用-m启动
如何判断该用哪种?看两个关键信号
不必死记规则,只需观察两个事实:
-
是否在包内? —— 如果模块位于
__init__.py所在目录及其子目录中,且你希望复用已有包结构,相对导入可用于简化同包引用(但非必需) -
怎么启动它? —— 如果计划用
python script.py运行,必须用绝对导入(或确保路径正确);如果设计为包入口(如python -m myapp.cli),相对导入才安全可用 - 小技巧:在包的
__init__.py中统一用绝对导入暴露接口,内部模块之间可酌情用相对导入,但对外始终提供绝对路径入口
常见陷阱与修复建议
很多导入错误其实源于对执行上下文理解偏差:
-
ModuleNotFoundError: No module named 'xxx':多半是绝对导入路径没进 sys.path,可在启动前加sys.path.insert(0, os.path.dirname(__file__)),但更规范的做法是安装开发版:pip install -e . -
attempted relative import with no known parent package:说明模块的__package__是None,即未被识别为包的一部分。检查是否漏了__init__.py,或是否错误地双击运行了 .py 文件 - 混用两种导入导致路径混乱:例如在
subpackage/a.py中写from .. import b(相对)又写import mypackage.b(绝对),可能因 PYTHONPATH 或安装状态不同而行为不一致
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










