Python3 sys 模块
在 Python 中,
sys模块是与解释器交互的桥梁,提供了一系列用于访问 Python 解释器本身和操作系统相关信息的函数与变量。无论是获取命令行参数、控制程序退出、还是查看系统环境,sys模块都扮演着不可或缺的角色。本文将系统讲解sys模块的常用功能及实战场景,帮助你高效利用其特性。一、sys 模块的基本使用
sys模块是 Python 标准库的一部分,无需额外安装,直接导入即可使用:import sys
二、核心功能与常用变量
1. 命令行参数:sys.argv
sys.argv是一个列表,存储程序运行时传入的命令行参数,其中:sys.argv[0]:当前脚本的文件名(或路径);sys.argv[1:]:实际传入的参数列表。
示例:创建
demo.py脚本:import sys
print("脚本名:", sys.argv[0])
print("参数列表:", sys.argv[1:])
print("参数个数:", len(sys.argv) - 1)
运行命令及输出:
python demo.py hello world 123
脚本名: demo.py参数列表: ['hello', 'world', '123']
参数个数: 3
应用场景:处理命令行输入(如脚本参数解析、批量任务处理)。
2. 退出程序:sys.exit([status])
sys.exit()用于终止当前程序,可选参数status表示退出状态:- 若
status为整数:0 表示正常退出(默认),非 0 表示异常退出(可被操作系统捕获); - 若
status为字符串:会打印该字符串并以状态码 1 退出。
示例:
import sys
if len(sys.argv) < 2:
sys.exit("错误:请提供至少一个参数") # 异常退出,输出提示
sys.exit(0) # 正常退出
3. 标准输入 / 输出 / 错误流:sys.stdin、sys.stdout、sys.stderr
这三个变量分别代表标准输入(键盘)、标准输出(屏幕)、标准错误流,均为文件对象,可用于重定向输入输出。
示例 1:重定向标准输出到文件
import sys
# 保存原始stdout
original_stdout = sys.stdout
# 将输出写入文件
with open("output.txt", "w") as f:
sys.stdout = f # 重定向stdout到文件
print("这段文字会写入文件")
print("而不是显示在屏幕上")
# 恢复原始stdout
sys.stdout = original_stdout
print("已恢复正常输出")
示例 2:从标准输入读取内容
import sys
print("请输入内容(按Ctrl+D结束):")
for line in sys.stdin: # 逐行读取键盘输入
print("你输入了:", line.strip())
4. 系统相关信息
(1)Python 解释器版本:sys.version、sys.version_info
sys.version:字符串形式的版本信息(如'3.9.7 (default, Sep 10 2021, 14:59:43) [GCC 8.4.0]');sys.version_info:元组形式的版本信息(包含主版本、次版本等),便于版本判断。
示例:
import sys
if sys.version_info >= (3, 6):
print("Python 3.6及以上版本,支持f-string")
else:
print("Python版本过低,不支持f-string")
(2)操作系统平台:sys.platform
返回当前操作系统的标识符,常见值:
win32:Windows 系统;linux:Linux 系统;darwin:macOS 系统。
示例:
import sys
if sys.platform == "win32":
print("Windows系统,路径分隔符为\\")
elif sys.platform == "linux":
print("Linux系统,路径分隔符为/")
(3)路径分隔符:sys.pathsep、sys.sep
sys.pathsep:用于分隔环境变量PATH的符号(Windows 为;,Linux/macOS 为:);sys.sep:路径中的目录分隔符(Windows 为\,Linux/macOS 为/)。
5. 模块搜索路径:sys.path
sys.path是一个列表,存储 Python 解释器查找模块的路径。当使用import导入模块时,解释器会依次搜索sys.path中的目录。示例:
import sys
print("模块搜索路径:")
for path in sys.path:
print(path)
# 临时添加自定义路径(程序退出后失效)
sys.path.append("/home/user/my_modules")
应用场景:动态添加自定义模块所在目录,解决 “模块找不到” 问题。
6. 递归深度限制:sys.getrecursionlimit()、sys.setrecursionlimit(n)
Python 默认递归深度限制为 1000,超过会抛出
RecursionError。可通过这两个函数查看或修改限制(需谨慎,过大可能导致内存溢出)。示例:
import sys
print("默认递归深度:", sys.getrecursionlimit()) # 输出:1000
sys.setrecursionlimit(2000) # 修改为2000
三、实战场景示例
1. 命令行参数解析(简易版)
实现一个计算两数之和的脚本,通过命令行传入参数:
import sys
def add(a, b):
return a + b
if __name__ == "__main__":
if len(sys.argv) != 3:
sys.exit("用法:python add.py <数字1> <数字2>")
try:
num1 = float(sys.argv[1])
num2 = float(sys.argv[2])
print(f"{num1} + {num2} = {add(num1, num2)}")
except ValueError:
sys.exit("错误:请输入有效的数字")
运行效果:
python add.py 3.5 4.2
3.5 + 4.2 = 7.7
2. 捕获程序异常并正常退出
在程序崩溃时,通过
sys.exit()返回非 0 状态码,便于外部脚本判断执行结果:import sys
try:
# 模拟可能出错的代码
result = 1 / 0
except ZeroDivisionError as e:
print(f"程序出错:{e}", file=sys.stderr) # 错误信息写入stderr
sys.exit(1) # 异常退出,状态码1
sys.exit(0) # 正常退出
3. 限制程序运行时间
结合
signal模块(Linux/macOS)和sys.exit(),实现程序超时自动退出: import sys
import signal
def timeout_handler(signum, frame):
sys.exit("程序超时,自动退出")
# 设置超时时间为5秒
signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(5)
# 模拟耗时操作(若超过5秒则触发超时)
import time
time.sleep(6) # 超过5秒,触发超时
四、注意事项
-
sys.exit()与exit()的区别:sys.exit()是模块级函数,功能更灵活(支持状态码),适合在脚本中使用;exit()是交互式解释器中的函数,本质上调用sys.exit(),不建议在脚本中使用。
-
sys.path的修改范围:通过sys.path.append()添加的路径仅在当前程序运行时有效,不会修改系统环境变量。 -
跨平台兼容性:使用
sys.platform和sys.sep等变量处理路径或系统相关逻辑,避免硬编码(如直接写死\或/)。
总结
sys模块是 Python 与系统交互的核心工具,其功能涵盖命令行参数处理、程序退出控制、输入输出重定向、系统信息获取等多个方面。掌握sys.argv、sys.exit()、sys.path等核心成员,能帮助你编写更灵活、更贴近系统的 Python 程序,尤其在脚本开发、命令行工具编写等场景中不可或缺。合理利用sys模块的特性,可显著提升程序的适应性和可控性。
浙公网安备 33010602011771号