大家好,我是正在实战各种 AI 项目的程序员晚枫。
import 语句背后发生了什么?模块缓存、导入钩子、相对导入...这一讲,揭开 Python 导入系统的全部秘密。
📖 开篇:import 比你想象的复杂
1 | import os |
这些 import 语句背后,Python 做了大量工作:
- 查找模块(sys.path)
- 加载模块代码
- 缓存模块对象(sys.modules)
- 绑定到命名空间
🔍 完整导入流程
1 | import os |
sys.modules 详解
1 | import sys |
sys.path(模块查找路径)
1 | import sys |
🎯 Finder 与 Loader
元路径查找器(Meta Path Finder)
1 | import sys |
自定义 Loader
1 | import sys |
📦 包(Package)的导入
init.py
1 | # mypackage/__init__.py |
1 | import mypackage |
相对导入
1 | # mypackage/core/__init__.py |
main.py(可执行包)
1 | # mypackage/__main__.py |
1 | # mypackage/__main__.py |
🔄 重新加载模块
1 | import importlib |
⚠️ 常见陷阱
陷阱1:循环导入
1 | # a.py |
解决:延迟导入(在函数内部 import)、重构模块结构。
陷阱2:导入顺序依赖
1 | # __init__.py 依赖某个模块先被导入 |
💡 本节作业
- 打印 sys.path 并解释每条路径的作用
- 写一个 DebugFinder 拦截所有 import 请求
- 创建自己的包,包含 init.py、utils.py,验证导入行为
🎯 本讲总结
导入流程:检查缓存 -> Finder 查找 -> Loader 执行 -> 缓存模块 -> 绑定命名空间。
sys.modules:模块缓存字典,所有已导入模块都在这里。
sys.path:模块查找路径列表,按顺序搜索。
Finder/Loader:元路径查找器和加载器,可以自定义导入行为。
包的结构:init.py、main.py、相对导入。
📚 推荐教材
《Python 编程从入门到实践(第 3 版)》 | 《流畅的 Python(第 2 版)》 | 《CPython 设计与实现》
🔗 课程导航
← 上一讲:线程与并发 | 下一讲:C 扩展编程 →
💬 联系我
| 平台 | 账号/链接 |
|---|---|
| 微信 | 扫码加好友 |
| B 站 | Python 自动化办公社区 |
主营业务:AI 编程培训、企业内训、技术咨询