python的import是有序、可干预、带缓存的动态加载机制,包含模块搜索路径、加载三步(查找→编译→执行)、sys.modules缓存及相对导入规则。

Python 的 import 不是简单“复制粘贴”代码,而是一套有顺序、可干预、带缓存的动态加载机制。理解它,能帮你避开循环导入、路径错误、模块重载异常等问题。
模块搜索路径:从 sys.path 开始找
执行 import name 时,Python 按 sys.path 列表从左到右查找:
- 脚本所在目录(
'',即空字符串,代表当前工作目录) - 环境变量
PYTHONPATH指定的路径(如有) - 标准库安装路径(如
/usr/lib/python3.11) -
.pth文件扩展路径(如 site-packages 中的第三方包)
你可以随时修改 sys.path 来临时添加自定义路径,但不推荐在生产中硬编码路径;更稳妥的方式是用 pip install -e . 安装本地包,或配置 PYTHONPATH 环境变量。
模块加载三步走:查找 → 编译 → 执行
找到匹配的文件后,Python 并非直接运行,而是严格按以下流程处理:
立即学习“Python免费学习笔记(深入)”;
启山智软物流配送是基于Spring Cloud 和 Vue.js的JAVA物流配送系统。包含总控制后台 、城市合伙人(商家pc端)、 区域团长后台 、用户端小程序 、手机H5等多个操作模块。为响应用户需求我们新增了后台自定义装修组件模块,使页面更加美观,操作更加灵活简便。淘宝商品CSV一键导入,提升用户使用感。还有与众不同的管理台侧边栏设计,打破传统管理台样式。 另有公众号接龙、引导页上传、区域团
-
查找:在
sys.path中定位name.py或name/__init__.py(包) -
编译:将源码编译为字节码(
.pyc),存入__pycache__目录(如name.cpython-311.pyc)。若字节码存在且时间戳新于源码,则跳过编译 -
执行:在新命名空间中运行模块顶层代码(包括函数定义、类声明、赋值语句等),结果绑定到
sys.modules中的对应键上
注意:模块只执行一次 —— 后续 import 都直接从 sys.modules 返回已加载对象,不会重复执行顶层代码。
sys.modules 是核心缓存字典
这是一个全局注册表,键是模块名(如 'os'、'mylib.utils'),值是已加载的模块对象。它的作用包括:
- 避免重复加载和执行,提升性能
- 支持手动注入模块(调试或插件场景),例如:
sys.modules['fake_module'] = MyMock() - 判断模块是否已导入:
'requests' in sys.modules - 强制重载需先删键再 import:
del sys.modules['mymodule']; import mymodule(仅限开发调试,有风险)
相对导入与包结构强相关
在包内使用 from . import xxx 或 from ..utils import helper 时,Python 要求:
- 必须在包内模块中执行(即该模块的
__package__属性非空) - 不能作为脚本直接运行(
python mypackage/sub.py会报SystemError: Parent module '' not loaded),应通过-m参数启动:python -m mypackage.sub - 相对导入只解析到包层级,不跨项目根目录;绝对导入(如
from mypackage.utils import x)则依赖sys.path是否包含包的父目录
常见误区:把包当作普通文件夹操作,忽略 __init__.py 的存在性或 __package__ 的设置逻辑。
不复杂但容易忽略:每次 import 都在查路径、查缓存、管命名空间。掌握这四点,就能稳住导入行为,不再被 “ModuleNotFoundError” 或 “ImportError: attempted relative import” 卡住。









