包的相对导入
包的相对导入(relative import),就是在一个包(package)里,让模块A引用模块B,不是用绝对路径(从顶层包开始写全路径),而是用“相对”位置(当前文件夹、父文件夹等)。
mypkg/mod_a.pysubpkg/__init__.pymod_b.py
想在 subpkg/mod_b.py 里导入 mod_a.py 的内容:
绝对导入
from mypkg import mod_a
有时需要在mod_b.py
添加项目的路径
import sys
sys.path.append(os.path.dirname(os.path.dirname(__file__)))# 或者
cur_dir = os.path.dirname(os.path.abspath(__file__)) # 当前脚本目录
parent_dir = os.path.dirname(cur_dir) # 上级目录
sys.path.append(parent_dir)
相对导入
from .. import mod_a # 两个点表示“父包”
-
必须是包(有__init__.py)
相对导入只对“包”生效,普通脚本不能直接相对导入。 -
不能直接用 python xxx.py 启动子模块
相对导入要求你用包的方式运行。否则会报错 ImportError: attempted relative import with no known parent package。
正确方式:在包的上级目录,使用:
python -m mypkg.subpkg.mod_b
这样 Python 能知道“父包”是谁。
- 相对路径只适用于同一个包下的模块之间的引用,不适用于跨包、跨项目的导入。
相对导入的常见写法
-
from . import xxx # 当前目录(包)
-
from … import xxx # 上一级包
-
from …other_pkg import xxx # 上一级包里的other_pkg