You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python相对导入需先将包作为模块导入?求规范依据

Python相对导入的核心逻辑与规范依据

典型问题案例

测试Python相对导入时,常会遇到如下报错场景:

$ mkdir project
$ cat >> project/one.py
from . import two
$ touch project/two.py
$ python project/one.py 
Traceback (most recent call last):
  File "project/one.py", line 1, in <module>
    from . import two
ImportError: attempted relative import with no known parent package

为什么包内相对导入需要先将包作为模块导入?

相对导入的核心是依赖模块的层级归属关系定位目标模块,而这个关系需要Python解释器明确当前模块的包身份:

  • 直接运行project/one.py时,解释器会将其视为独立顶层脚本,而非某个包的子模块。此时脚本的__name__为__main__,且没有__package__属性标识父包,无法解析from . import two这类相对路径。
  • 只有当包被作为模块导入(无论是通过-m参数以模块模式运行,还是外部脚本做绝对导入),解释器才会为包内子模块建立完整的层级关联,子模块的__package__属性会被正确设置为父包名称,相对导入才能基于这个层级找到目标模块。

Python规范中的定义位置

该规则属于Python导入系统的核心逻辑:相对导入仅允许在被当作包的一部分导入的模块中使用,直接运行的脚本无法使用相对导入。这一要求在Python官方语言参考的「模块」章节中有明确定义。

可行解决方案

针对上述问题,有两种标准解决方式:

  • 以模块方式运行脚本
    通过-m参数告知解释器将project.one作为包子模块运行,此时解释器会先加载project包,再处理one.py:
$ python -m project.one
  • 使用外部驱动脚本进行绝对导入
    在包的同级目录创建驱动脚本,通过绝对导入加载包内模块。驱动脚本所在目录默认在sys.path中,可直接定位project包:
$ cat >> driver.py
import project.one 
$ python driver.py

内容的提问来源于stack exchange,提问作者Max Koretskyi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:27:39