python Import解析
这篇笔记从 Python 的 module 与 package 基本模型切入,把“一个 .py 文件就是模块、目录可组织为包和子包”的关系先讲清楚,再延伸到 import 触发后的查找流程。正文重点解释了 Python 会先检查 sys.modules 缓存,命中则复用已加载模块,若对应值为 None 会抛出 ModuleNotFoundError;未命中时再遍历 sys.meta_path,由内置模块、冻结模块和基于路径的查找器继续解析。文章结合 sys.path 的实际输出,拆解了项目目录、脚本目录、PyCharm 辅助路径、标准库 zip 与动态库路径、虚拟环境 site-packages 在导入搜索中的作用,适合用来定位“为什么某个模块能或不能被导入”。相对导入与绝对导入部分对比了 import A.B、from A import B 以及 from . import B、from ..A import B 等写法,并指出直接运行脚本与使用 python -m 以模块方式运行时,放入 sys.path 的目录不同,可能影响导入结果。依赖管理部分补充了 pip install 后包目录、dist-info、扩展文件和元数据的组成,以及 pip freeze 生成完整环境依赖、pipreqs 扫描项目生成最小依赖列表的差异。最后还提到导包顺序通常按标准库、第三方库、自定义库分组并字母排序,可借助 usort 格式化,整体适合 Python 初学者、后端开发和需要排查导入路径问题的项目维护者阅读。



