2025-08-21 Python进阶3——模块
文章目录
- 1 模块基础
- 1.1 模块的创建与导入
- 1.2 模块的执行特性
- 2 模块的高级用法
- 2.1 以脚本方式执行模块
- 2.2 模块搜索路径
- 2.3 已编译的 Python 文件
- 3 标准模块
- 4 dir () 函数
- 5 包(Packages)
- 5.1 包的结构
- 5.2 包的导入
- 5.3 控制包的导入行为
- 5.4 相对导入
- 5.5 包的路径扩展
- 6 总结
1 模块基础
模块是包含 Python 定义和语句的文件,文件名即为模块名加 .py
后缀。使用模块可以:
- 保存代码以便重复使用
- 将代码组织成逻辑单元
- 避免命名冲突
下面是一个使用 python 标准库中模块的例子。
#!/usr/bin/python3
# 文件名: using_sys.pyimport sysprint('命令行参数如下:')
for i in sys.argv:print(i)print('\n\nPython 路径为:', sys.path, '\n')
执行结果如下所示:
$ python using_sys.py 参数1 参数2
命令行参数如下:
using_sys.py
参数1
参数2Python 路径为: ['/root', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
import sys
引入 python 标准库中的 sys.py 模块;这是引入某一模块的方法。sys.argv
是一个包含命令行参数的列表。sys.path
包含了一个 Python 解释器自动查找所需模块的路径的列表。
1.1 模块的创建与导入
创建模块:创建一个 fibo.py
文件
# 斐波那契数列模块def fib(n):"""打印斐波那契数列直到n"""a, b = 0, 1while a < n:print(a, end=' ')a, b = b, a+bprint()def fib2(n):"""返回斐波那契数列直到n的列表"""result = []a, b = 0, 1while a < n:result.append(a)a, b = b, a+breturn result
导入模块:
# 导入整个模块
import fibo# 使用模块中的函数
fibo.fib(1000) # 0 1 1 2 3 5 8 ... 987
print(fibo.fib2(100)) # [0, 1, 1, 2, ..., 89]# 查看模块名称
print(fibo.__name__) # 'fibo'# 为模块创建别名
import fibo as fib
fib.fib(500) # 0 1 1 2 3 ... 377# 导入特定函数
from fibo import fib, fib2
fib(500) # 直接使用函数名# 导入函数并指定别名
from fibo import fib as fibonacci
fibonacci(500) # 使用别名调用
1.2 模块的执行特性
- 模块中的代码仅在第一次被导入时执行
- 每个模块有自己的命名空间,避免全局变量冲突
- 可以通过
modname.itemname
访问模块中的元素
2 模块的高级用法
2.1 以脚本方式执行模块
在模块末尾添加判断,可以使模块既可以被导入,又可以作为脚本运行:
# 斐波那契数列模块def fib(n):"""打印斐波那契数列直到n"""a, b = 0, 1while a < n:print(a, end=' ')a, b = b, a+bprint()def fib2(n):"""返回斐波那契数列直到n的列表"""result = []a, b = 0, 1while a < n:result.append(a)a, b = b, a+breturn result# 当模块作为脚本运行时执行
if __name__ == "__main__":import sysif len(sys.argv) > 1:fib(int(sys.argv[1]))
运行方式:
python fibo.py 50
# 输出: 0 1 1 2 3 5 8 13 21 34
说明:每个模块都有一个 name 属性。
- 如果模块是被直接运行,
__name__
的值为__main__
。 - 如果模块是被导入的,
__name__
的值为模块名。
说明:name 与 main 底下是双下划线, _ _
是这样去掉中间的那个空格。
2.2 模块搜索路径
Python 解释器按以下顺序搜索模块:
- 内置模块
sys.path
列表中的目录,包括:- 当前脚本所在目录
PYTHONPATH
环境变量指定的目录- 安装时默认的目录
查看和修改搜索路径:
import sys# 查看当前搜索路径
print(sys.path)# 添加新的搜索路径
sys.path.append('/path/to/new/directory')
2.3 已编译的 Python 文件
为了加速模块加载,Python 会将模块编译为 .pyc
文件,存储在 __pycache__
目录中:
- 编译文件格式:
module.version.pyc
(如fibo.cpython-39.pyc
) - 仅加快加载速度,不影响执行速度
- 会自动检查源文件是否修改,必要时重新编译
编译优化:
# 生成优化的编译文件(去除断言)
python -O -m compileall fibo.py# 生成更精简的编译文件(去除断言和文档字符串)
python -OO -m compileall fibo.py
3 标准模块
Python 自带丰富的标准模块库,例如:
- sys 模块:提供与 Python 解释器交互的功能
import sys# 命令行参数
print(sys.argv)# 退出程序
sys.exit(0)# 标准输入输出
sys.stdout.write("Hello\n")
- os 模块:提供与操作系统交互的功能
import os# 获取当前目录
print(os.getcwd())# 创建目录
os.mkdir("new_dir")# 列出目录内容
print(os.listdir("."))
4 dir () 函数
dir()
函数用于查看模块中定义的名称:
import fibo# 查看模块中定义的名称
print(dir(fibo)) # ['__name__', 'fib', 'fib2']# 无参数时,查看当前作用域中的名称
a = 1
print(dir()) # 包含 'a', 'fibo', 等# 查看内置函数和变量
import builtins
print(dir(builtins)) # 列出所有内置函数和类型
5 包(Packages)
包是模块的集合,用于组织多个相关模块,避免命名冲突。
5.1 包的结构
一个典型的包结构如下:
sound/ # 顶层包__init__.py # 包初始化文件formats/ # 子包:文件格式处理__init__.pywavread.pywavwrite.py...effects/ # 子包:音效处理__init__.pyecho.pyreverse.py...filters/ # 子包:过滤器__init__.pyequalizer.py...
__init__.py
文件的作用:
- 标识该目录为 Python 包
- 可以包含包的初始化代码
- 定义
__all__
变量,控制from package import *
的行为
5.2 包的导入
# 导入子模块
import sound.effects.echo# 使用子模块中的函数
sound.effects.echo.echofilter(input, output)# 从包中导入子模块
from sound.effects import echo# 使用导入的子模块
echo.echofilter(input, output)# 直接导入函数
from sound.effects.echo import echofilter# 使用导入的函数
echofilter(input, output)
5.3 控制包的导入行为
在 __init__.py
中定义 __all__
变量:
# 定义 from sound.effects import * 时要导入的模块
__all__ = ["echo", "surround", "reverse"]
这样,from sound.effects import *
会导入 echo
、surround
和 reverse
三个子模块。
5.4 相对导入
在包内部,可以使用相对导入引用其他模块:
# 在 sound/effects/surround.py 中
from . import echo # 导入同级别模块
from .. import formats # 导入上级包中的模块
from ..filters import equalizer # 导入同级其他子包中的模块
.
表示当前包..
表示上级包- 主模块不能使用相对导入,必须使用绝对导入
5.5 包的路径扩展
包的 __path__
属性可以修改,用于扩展包的搜索路径:
# 在 sound/__init__.py 中
import sys
from os.path import join, dirname# 添加额外的搜索路径
__path__.append(join(dirname(__file__), 'extra_modules'))
这使得包可以动态加载位于不同目录中的模块。
6 总结
- 模块是包含 Python 代码的文件,扩展名为
.py
- 包是组织多个相关模块的目录结构,包含
__init__.py
文件 - 使用
import
和from ... import
语句导入模块和包 sys.path
控制模块搜索路径dir()
函数用于查看模块中定义的名称- 模块可以作为脚本运行,通过
if __name__ == "__main__":
控制执行逻辑