Python模块导入通过\_import\_函数执行查找、加载、初始化三阶段:先查sys.modules缓存,再经sys.meta_path和sys.path查找;找到后由loader编译执行;最后设置\_\_name\_\_等属性并完成初始化。
Python 的模块导入不是简单地把文件内容复制进来,而是通过一套严谨的加载流程完成的。核心在于
函数(实际由
调用,底层由
实现),它控制从查找、加载到初始化的全过程。
模块查找阶段:sys.meta_path 与 sys.path 的协同作用
当执行
时,Python 首先尝试在已缓存的
中查找。若未命中,则依次遍历
中的 finder 对象(如
)。默认的
会基于
中的路径,按顺序拼接
、
等路径,检查文件是否存在。
支持自定义 finder,可用于实现 zip 包导入、网络模块加载等扩展行为
中的空字符串代表当前目录,修改它可影响模块搜索顺序(但不推荐直接操作)
内置模块(如
、
)由
直接处理,不走文件系统路径
模块加载阶段:从源码编译到代码对象执行
找到对应文件后,Python 根据后缀选择 loader(如
加载 .py,
加载 .so/.dll)。loader 负责读取源码、调用
编译为字节码(
),再通过
在模块命名空间中运行该代码对象。
每次 import 都只执行一次模块顶层代码;重复 import 直接返回
中已缓存的模块对象
本质仍是完整加载
,再从其命名空间提取
如果模块中有语法错误,会在
阶段抛出
,而非导入时立即报错
模块初始化阶段:__name__、__package__ 与 __path__ 的设置
执行模块代码前,loader 会预先设置关键属性:
设为模块全名(如
),
设为父包名(用于相对导入解析),对包目录还会初始化
列表(支持后续子模块查找)。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
立即学习
“
Python免费学习笔记(深入)
”;
顶层脚本的
是
,这正是
的判断依据
相对导入(
)依赖
,若模块非包内执行或未正确设置,会触发
或
包的
可被动态修改,用于实现 namespace package(PEP 420)
手动触发导入:importlib.import_module 与 __import__ 的区别
显式调用
是推荐方式,它自动处理包层级和相对导入逻辑;而内置
行为更底层,对相对导入支持有限,且返回的是最左端模块(
时返回
而非
),日常开发应避免直接使用。
+
可实现完全手动控制加载过程,适合插件系统或热重载场景
动态导入失败时,异常类型与普通 import 一致(
、
等),需显式捕获
所有导入最终都经由
统一调度,这是 CPython 的核心实现入口
_import___import__importlib._bootstrapimport xxxsys.modulessys.meta_pathPathFinderPathFindersys.pathxxx.pyxxx/__init__.pysys.meta_pathsys.pathsysbuiltinsBuiltinImporterSourceFileLoaderExtensionFileLoadercompile()PyCodeObjectexec()sys.modulesfrom xxx import yyyxxxyyyexecSyntaxError__name__a.b.c__package____path____name__'__main__'if __name__ == '__main__':from . import xxx__package__SystemErrorImportError__path__importlib.import_module('a.b.c')__import__import a.b.cacimportlib.util.spec_from_file_location()importlib.util.module_from_spec()ModuleNotFoundErrorImportErrorimportlib._bootstrap._find_and_load()