python之包导入过程

 更新时间:2026年07月08日 10:54:59   作者: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
  • 不用相对路径
  • 项目任意位置都能互相导入
  • 适合正式开发

三种方式对比:

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

总结

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

相关文章

  • python和flask中返回JSON数据的方法

    python和flask中返回JSON数据的方法

    下面小编就为大家整理了一篇python和flask中返回JSON数据的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • 对python 合并 累加两个dict的实例详解

    对python 合并 累加两个dict的实例详解

    今天小编就为大家分享一篇对python 合并 累加两个dict的实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Mysql分组查询group by与with rollup方式

    Mysql分组查询group by与with rollup方式

    这篇文章主要介绍了Mysql分组查询group by与with rollup方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 使用python判断jpeg图片的完整性实例

    使用python判断jpeg图片的完整性实例

    今天小编就为大家分享一篇使用python判断jpeg图片的完整性实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Python 如何引入同级包和模块

    Python 如何引入同级包和模块

    这篇文章主要介绍了Python 如何引入同级包和模块,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Pyhton模块和包相关知识总结

    Pyhton模块和包相关知识总结

    文中详细整理了关于Python模块和包的相关知识点,刚入门Python的小伙伴们可以学习一下,有助于加深Python基础的理解.而且有详细说明及代码示例,需要的朋友可以参考下
    2021-05-05
  • python 类型转换函数示例详解

    python 类型转换函数示例详解

    这篇文章主要介绍了python 类型转换函数示例详解,通过float()将一个字符串或数字转换为浮点数,本文结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • 利用Python的Flask框架来构建一个简单的数字商品支付解决方案

    利用Python的Flask框架来构建一个简单的数字商品支付解决方案

    这篇文章主要介绍了利用Python的Flask框架来构建一个简单的数字商品支付解决方案,文中用极简的代码展示了一个flask框架下的支付模版,需要的朋友可以参考下
    2015-03-03
  • 深入详解Python中Micawber库的使用

    深入详解Python中Micawber库的使用

    Python Micawber库就是一个用于解析和嵌入媒体资源的工具,它可以自动识别各种媒体资源的URL,下面就跟随小编一起来看看它的具体使用吧
    2022-06-06
  • Python存取XML的常见方法实例分析

    Python存取XML的常见方法实例分析

    这篇文章主要介绍了Python存取XML的常见方法,结合具体实例形式较为详细的分析了Python存取xml的常用方法、优缺点比较与相关注意事项,需要的朋友可以参考下
    2017-03-03

最新评论