Python模块导入的细节详解
在 Python 中,一个模块是一个包含了 Python 定义和语句的文件。模块能够被别的程序引入,这样就可以使用模块中的函数,类和变量等资源。Python 模块的导入方式有三种:
- import 模块名
- import 模块名 as 别名
- from 模块名 import 模块元素名
模块搜索路径
在模块导入时,Python 会从各种目录和位置去寻找模块,这些目录和位置被称为搜索路径(search path),Python 解释器根据搜索路径来定位模块文件,搜索路径按照如下顺序查找:
- 内置模块
- sys.path 变量指定的目录
- PYTHONPATH 环境变量指定的目录
- 默认目录和 PYTHONPATH 未定义时的兜底目录
模块导入机制
Python 会在内存中存储已经导入的模块,这是为了避免多次导入同一个模块,导致重复执行模块初始化代码。
当模块被导入时,Python 解释器会执行该模块的代码。而且这个且只有一次。如果在 Python 解释器退出以后再次导入该模块,解释器会直接加载内存缓存,避免再次执行模块代码。
从模块导入的角度来看,Python 中一个模块(.py 文件)就是一个名称空间(namespace)。在这个名称空间中,可以使用所有模块内的函数、变量和因素等。
示例一
下面的示例介绍了如何导入一个模块,并使用其中的函数和变量:
# 导入Python内置模块math
import math
# 导入math模块中的pi
from math import pi
# 使用math模块中的sqrt函数
print(math.sqrt(2))
# 使用math模块中常量pi
print(pi)
# 更改导入模块的名称,将math模块的别名设置为 m
import math as m
print(m.sqrt(2))
输出结果:
1.4142135623730951
3.141592653589793
1.4142135623730951
示例二
下面的示例演示模块搜索路径和模块缓存:
假设我们有一个模块 utils.py,内容如下:
# utils.py
NAME = "utils"
def get_name():
return NAME
我们创建一个脚本 main.py,当中导入该模块两次:
# main.py
import sys
import os
import utils
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
import utils
print(utils.get_name())
在模块导入路径搜索规则中,第一条是内置模块,不在搜索路径中。直接从 utils 模块文件中导入相应的模块。第二次导入时,该模块已经被缓存,直接从缓存中读取。
输出结果:
utils
结论
了解 Python 模块导入机制和模块搜索路径机制对于我们编写高质量代码是非常有帮助的。编写 Python 代码的时候,应该按照 Python 的模块导入约定以及模块搜索路径去编写并组织自己的 Python 代码。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python模块导入的细节详解 - Python技术站