sys 模块是 Python 与解释器自身打交道的核心入口。它让你在程序运行时获取系统级信息、控制解释器行为、操作标准输入输出。一旦你的脚本需要处理命令行参数、退出状态、或者与操作系统边界打交道,sys 就是第一个该想到的模块。
命令行参数:sys.argv
- 作用:获取传递给 Python 脚本的命令行参数列表。
- 基本形式:
sys.argv是一个列表,第一项sys.argv[0]是脚本名本身,后面依次是你在命令行输入的各参数。 - 实例如:
# python script.py hello 42
import sys
print(sys.argv) # ['script.py', 'hello', '42']
script_name = sys.argv[0]
first_arg = sys.argv[1] # 'hello'
- 实用场景:
- 简单脚本直接靠
sys.argv获取参数,比argparse更轻量。 - 快速调试:在脚本开头打印
sys.argv就能看到传入的参数是否正确。
标准输入输出流:sys.stdin、sys.stdout、sys.stderr
sys.stdin:标准输入流,通常对应键盘输入或管道过来的内容。- 可以用
sys.stdin.read()或sys.stdin.readline()读取全部或逐行读取。 - 如果脚本需要接收管道数据(如
cat data.txt | python proc.py),直接从sys.stdin读即可。 sys.stdout:标准输出流,print()函数默认输出到这里。- 可以用
sys.stdout.write("text\n")直接输出(注意手动加换行)。 - 可以重定向:将
sys.stdout指定为文件对象,让所有print输出到文件。 sys.stderr:标准错误流,专门输出错误信息,不随stdout重定向。- 用法:
sys.stderr.write("错误信息\n"),或者使用print(..., file=sys.stderr)。
程序退出控制:sys.exit()
- 功能:立即终止当前程序,并可返回一个退出码(整型或字符串)。
sys.exit(0)正常结束,sys.exit(1)异常退出,常见于脚本失败。- 实际上
sys.exit()会引发SystemExit异常,catch 该异常可以阻止程序退出(通常用于测试或钩子)。 - 实用之处:
- 脚本出错时及早退出,避免继续执行产生更混乱的结果。
- 与其他命令行工具配合:通过退出码告诉调用方(shell 或 CI 系统)脚本执行状态。
解释器状态与路径:sys.path 等多重属性
sys.path:模块搜索路径列表。导入模块时,Python 会按这个列表的顺序寻找对应.py文件。- 初始
sys.path由环境变量PYTHONPATH、安装位置、当前工作目录等组成。 - 动态添加路径:
sys.path.append('/my/custom/lib'),让脚本能找到特定位置的模块。 sys.platform:一个字符串,标识运行平台,如'win32'、'linux'、'darwin'(macOS)。- 用于编写需要区分系统差异的代码:
if sys.platform.startswith('win'):
clear_cmd = 'cls'
else:
clear_cmd = 'clear'
sys.version:当前 Python 解释器的详细版本信息字符串,可用于检查版本。sys.getsizeof(obj):返回对象占用的内存字节数(仅对象本身,不包括所引用的其他对象),用于内存分析。
标准流的实用示例
从管道读取数据并处理,同时输出结果:
import sys
for line in sys.stdin:
line = line.strip()
if not line:
continue
processed = line.upper() # 示例:转为大写
sys.stdout.write(processed + '\n')
使用时:cat input.txt | python transform.py > output.txt
输出错误信息到 stderr,并在失败时退出:
import sys
def fail(msg):
print(f"Error: {msg}", file=sys.stderr)
sys.exit(1)
fail("配置文件不存在")
sys 模块的要点是:它让你在程序内部拥有与操作系统和解释器对话的能力。参数输入、输出控制、退出状态这几个核心需求,基本都能靠它解决。对于更复杂的命令行解析,我们会推荐 argparse;但对于直接、轻量的需求,sys 永远是最直接的选择。