人人都会AI编程

13.2 sys 模块:解释器交互、命令行参数、标准流、退出控制

更新时间:2026-07-12

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.stdinsys.stdoutsys.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 永远是最直接的选择。