Python 导入系统

import 由 finders/loaders 完成定位与执行,结果缓存于 sys.modules;可扩展但应谨慎。

#type / concept #status / growing #tech / dev #resource / python #tech / lang / python

[!info] 关联笔记

Python 导入系统

这个概念为什么出现

插件系统、命名空间包、延迟加载都碰到导入钩子。理解 finders/loaders 与缓存,才能诊断“导入到错误文件/循环/未刷新”。

[!abstract] 一句话理解 导入协议查找模块规格并加载执行,放入 sys.modules;自定义 hook 可扩展,但调试成本高。

最小可观察示例

场景:查看已缓存模块与查找路径

# import_system_observe.py
# 业务意图:观察 sys.modules 与 sys.path 入口。
# 教学点:缓存与搜索路径。

import sys
import json


def main() -> None:
    print("json cached?", "json" in sys.modules)
    print("path0:", sys.path[0])
    print("json file:", getattr(json, "__file__", None))


if __name__ == "__main__":
    main()

建议运行:

python import_system_observe.py

期望输出:json cached? True 与路径信息。

结合场景再看三个关注点

  1. 标准库导入后即缓存
  2. sys.path[0] 常是脚本目录。
  3. 改 path 是权宜之计。

核心概念与准确模型

  1. sys.meta_path finders
  2. module spec
  3. loader.exec_module
  4. 包的父路径与相对导入

边界情况与反直觉行为

  1. 删除 sys.modules 再导入 的副作用
  2. 循环导入 半初始化
  3. zipimport 等特殊 finder

常见误区

[!warning] 常见误区:import 只是文本包含 错误理解:C 的 #include。
正确模型:执行并缓存模块对象。

工程实践

  • 应用用包导入
  • 插件入口用明确注册
  • 少写自定义 import hook

本节总结

导入系统是可扩展运行时子系统。日常够用“包+绝对导入”,进阶才碰 hook。

自测题

  1. sys.modules 作用?
  2. 循环导入常见修复?
参考答案
  1. 模块缓存,避免重复执行。
  2. 重划依赖、延迟导入、把共享类型下沉。

延伸阅读与资料来源

资料类型支撑内容
The import system规范全文
importlib文档API
创建于 2026/7/15 更新于 2026/7/15