- Python运行时环境有一个强大的模块导入系统,使得开发者能够组织和重用代码。
- 模块的导入和加载是Python程序运行的一个重要阶段。
Python的模块导入系统是其运行时环境中的一个关键部分,它负责查找、加载和执行Python模块。导入系统是Python灵活性和可扩展性的一个重要组成部分,具有相对复杂的原理。
模块导入的过程:
- 模块搜索路径(sys.path):
- Python在导入模块时首先会在模块搜索路径中查找对应的模块文件。
sys.path是一个包含目录路径的列表,包括当前目录、标准库目录和其他用户自定义目录。
- 查找模块文件:
- 导入系统按照一定规则查找模块文件,通常为在每个路径下寻找与模块名相匹配的文件,例如
example.py。
- 编译和缓存:
- 如果找到模块文件,导入系统会将其编译成字节码(.pyc文件),并缓存起来。如果存在对应的.pyc文件,导入系统会检查文件是否被修改,以确定是否需要重新编译。
- 执行模块代码:
- 导入系统会执行模块的代码,并创建一个模块对象。模块对象中包含了模块中定义的变量、函数、类等。
模块搜索路径的顺序:
- 内置模块:
- 首先搜索内置模块,这些模块通常是在Python安装时包含的,无需额外的路径查找。
- sys.path中的目录:
- 搜索
sys.path中列出的目录,包括当前目录、用户自定义目录等。
- ZIP文件:
- 如果模块以.zip文件形式存在,也会被搜索和导入。
模块导入的原理:
-
__init__.py文件:
- 如果模块所在的目录中包含
__init__.py文件,Python会将其视为一个包(package),并执行其中的代码。
-
命名空间和属性:
- 导入模块后,会创建一个模块级别的命名空间,所有在模块中定义的变量、函数、类等都在该命名空间中。通过模块命名空间,可以通过点运算符访问模块中的属性。
import module_name
module_name.variable_name
-
避免循环导入:
- Python导入系统会检测并避免循环导入的问题。如果模块A导入了模块B,而模块B又导入了模块A,系统会在导入过程中处理这种循环引用。
模块导入的优化:
- 编译和缓存:
- 为了提高导入性能,Python会在
__pycache__目录中缓存编译后的字节码文件(.pyc文件)。
sys.modules缓存:
- Python使用
sys.modules字典缓存已经导入的模块,避免重复导入相同的模块。