Python 中如何使用相对导入(relative import)?

Python 相对导入用点号语法:from . import module2(同包)、from .subpackage import xxx(子包)、from .. import xxx(上级包)。相对导入只在包内有效。本文给出完整示例。

最佳实践
Python 中如何使用相对导入(relative import)?封面

相对导入用点号表示层级:from . import module2(当前包)、from .subpackage import submodule1(子包)、from .. import xxx(上级包)。关键前提:相对导入只在包内有效,直接运行单个 .py 文件时会失败。

包结构示例

my_package/
    __init__.py
    module1.py
    module2.py
    subpackage/
        __init__.py
        submodule1.py

各种相对导入写法

# module1.py 中

from . import module2                    # 导入同包的 module2
from .module2 import some_function       # 导入同包模块的函数
from .subpackage import submodule1       # 导入子包中的模块
from .subpackage.submodule1 import func  # 导入子包模块的函数
# subpackage/submodule1.py 中

from .. import module1        # 两个点 = 上级包
from ..module2 import helper

常见错误:直接运行含相对导入的文件

python my_package/module1.py   # ImportError: attempted relative import with no known parent package

相对导入依赖 __package__ 属性,直接运行文件时该属性为空。正确做法是以模块方式运行:

python -m my_package.module1

相对导入 vs 绝对导入

# 绝对导入(推荐,更清晰)
from my_package.module2 import some_function

# 相对导入(包内重构时不用改路径)
from .module2 import some_function

PEP 8 更推荐绝对导入(可读性好);包内部模块互相引用时相对导入能减少耦合。

常见问题(FAQ)

Q:一个点、两个点、三个点分别什么意思?
A:. 当前包,.. 上级包,... 上上级包,和文件路径的 ./.. 类似。

Q:为什么 IDE 里相对导入显示红线但运行正常?
A:IDE 可能没把项目根目录标记为 sources root。PyCharm 里右键目录 → Mark Directory as → Sources Root。

Q:init.py 必须存在吗?
A:Python 3.3+ 支持命名空间包(无 init.py),但常规包建议保留,且它是包初始化的钩子。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台