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 与版本信息,即可写出规范的命令行脚本。

笔记加载中…