Python3 sys 模块
sys 模块提供与 Python 解释器本身相关的功能:命令行参数、退出程序、模块搜索路径、标准输入输出等。凡是写命令行工具、脚本,几乎都会用到它。
sys.argv:获取命令行参数
命令行传给脚本的参数存放在列表 sys.argv 中,第一个元素永远是脚本名:
# 保存为 demo.py,运行:python demo.py a b
import sys
print(sys.argv)
# 输出:['demo.py', 'a', 'b'] (第一个元素永远是脚本名)
print(len(sys.argv)) # 输出:3
sys.exit:退出程序
用 sys.exit() 主动终止程序,可携带退出状态码或错误消息:
import sys
sys.exit() # 正常退出,状态码 0
sys.exit(1) # 状态码 1 退出,终端可用 $? / %ERRORLEVEL% 看到
sys.exit("出错了") # 打印消息到 stderr,再以状态码 1 退出
调用后其后的代码不再执行,常用于参数校验失败等需要提前终止的场合。
sys.path:模块搜索路径
import 时解释器按 sys.path 列表里的目录依次查找模块,可向其中追加自定义目录:
import sys
print(sys.path[0]) # 输出:当前脚本所在目录
sys.path.append("/my/modules") # 加入自定义目录后即可 import 该处模块
解释器与平台信息
判断运行环境、Python 版本时读取这些属性:
import sys
print(sys.version) # 输出:3.12.3 (main, ...) 完整版本串
print(sys.version_info) # 输出:sys.version_info(major=3, minor=12, ...)
print(sys.platform) # 输出:win32 / linux / darwin
print(sys.maxsize) # 输出:9223372036854775807(64 位机器)
stdin / stdout / stderr
三个标准流对象,与 input/print 等价,配合重定向更灵活:
import sys
line = sys.stdin.readline().strip() # 读一行,等价于 input()
sys.stdout.write("你输入了:" + line + "\n") # 写到标准输出
sys.stderr.write("这是一条警告\n") # 写到标准错误
递归深度限制
Python 默认递归上限约 1000 层,超限抛 RecursionError,可用 setrecursionlimit 调高:
import sys
print(sys.getrecursionlimit()) # 输出:1000
sys.setrecursionlimit(5000) # 调高上限(过高可能栈溢出崩溃,慎用)
示例:命令行求和脚本
综合运用 argv 与 exit,写一个可对任意个数求和的脚本:
import sys
nums = [float(x) for x in sys.argv[1:]] # 跳过脚本名,取其余参数
if not nums:
sys.exit("用法:python sum.py 1 2 3.5") # 无参数:提示后退出
print(f"总和:{sum(nums)}")
# 运行 python sum.py 1 2 3.5 → 输出:总和:6.5
小结:sys.argv 读参数、sys.exit 控制退出、sys.path 管理导入路径,再配合 stdin/stdout/stderr 与版本信息,即可写出规范的命令行脚本。