python之包导入过程
作者:wolfengi
想在Python项目中彻底告别导入报错?本文用真实案例对比sys.path、相对导入与可编辑安装三种方法,从自动搜索路径到绝对导入,手把手教你让任意子目录的py文件都能互相调用,点击即掌握最规范的包管理技巧,轻松解决跨目录导入难题
python 3.3+版本开始,不需要再主动创建__init__.py,直接使用绝对导入形式即可,只有跨目录导入时才需要绝对路径导入,同步路下不需要
project/ # 工作目录
├── main.py # ✅ 唯一入口,直接运行:python main.py
├── a/
│ ├── t1.py
│ └── c/
│ └── t3.py
└── b/
└── t2.py
入口是 main.py,且你在 project 目录下执行:
python main.py
project 目录会自动加入 Python 搜索路径
所以所有文件都能直接用绝对导入,从根目录开始写:
from b.t2 import 你的函数
必须 进入 project 文件夹 再运行命令:
cd project python main.py
python -m 模块名 = 让 Python 把目录当成「包」来运行,自动把当前文件夹加入导入路径
总结:
只要将project加入到搜索目录,任何子目录的py文件所引用的其他py,都是从project下开始找的;只要写的是绝对路径就行。比如用的a.c.t3就能找到,但是直接写c.t3就不行 因为c并不在project下,从project下找不到c的
方法 1:添加路径到 sys.path
最简单、最常用
原理:告诉 Python 去哪里找模块。
结构:
项目根目录/ ├─ a/ │ ├─ t1.py │ └─ c/ │ └─ t3.py └─ b/ └─ t2.py
代码
import sys from pathlib import Path # 把项目根目录加入 Python 搜索路径 sys.path.append(str(Path(__file__).parent.parent)) # 现在可以直接导入 from b import t2
方法 2:使用相对导入
适合包结构
要求:目录必须是Python 包,即每个目录下必须有 __init__.py(空文件即可)
结构:
项目根目录/ ├─ a/ │ ├─ __init__.py │ ├─ t1.py │ └─ c/ │ ├─ __init__.py │ └─ t3.py └─ b/ ├─ __init__.py └─ t2.py
代码
from ..b import t2
注意:相对导入不能直接运行脚本,必须从项目根目录用 -m 运行:
python -m a.t1 python -m a.c.t3
方法 3:把项目设为包
最规范、企业常用
在项目根目录下创建 pyproject.toml 或使用 pip install -e .
步骤:
- 项目根目录执行:
pip install -e .
- 之后任何文件都能直接导入:
from b import t2 from a import t1
优点:
- 不用加 sys.path
- 不用相对路径
- 项目任意位置都能互相导入
- 适合正式开发
三种方式对比:
| 方法 | 难度 | 适用场景 | 是否推荐 |
|---|---|---|---|
| sys.path | 最简单 | 测试、小脚本、快速开发 | ✅ 最推荐 |
| 相对导入 | 中等 | 包结构 | 可用 |
| 可编辑安装 | 规范 | 正式项目、多人开发 | ✅ 最专业 |
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
