python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python包导入

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 .

步骤:

  1. 项目根目录执行:
pip install -e .
  1. 之后任何文件都能直接导入:
from b import t2
from a import t1

优点:

三种方式对比:

方法难度适用场景是否推荐
sys.path最简单测试、小脚本、快速开发✅ 最推荐
相对导入中等包结构可用
可编辑安装规范正式项目、多人开发✅ 最专业

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文