跳转至

Python subprocess 模块

概念与用途

subprocess 创建外部进程、传递参数并捕获标准流,适合调用编译器、系统工具和独立程序。参数列表能绕开 Shell 解析,通常是最安全可靠的方式。

核心 API

subprocess.run() 覆盖大多数同步调用;check=True 在非零退出码时抛异常,capture_output=True 捕获输出,text=True 进行文本解码,timeout 限制运行时间。

import subprocess
import sys

result = subprocess.run(
    [sys.executable, "-c", "print(sum(range(5)))"],
    check=True,
    capture_output=True,
    text=True,
    timeout=5,
)
print(result.stdout.strip())

关键参数

参数 作用 安全/资源边界
check=True 非零退出码抛异常 不静默继续
timeout= 限制等待 捕获 TimeoutExpired
cwd= 指定工作目录 使用可信路径
env= 指定环境 从最小环境构建

示例:处理非零退出码

import subprocess
import sys

try:
    subprocess.run(
        [sys.executable, "-c", "raise SystemExit(3)"],
        check=True,
        timeout=5,
    )
except subprocess.CalledProcessError as error:
    print("退出码:", error.returncode)

subprocess 是标准库,无需安装。启动外部工具前仍需确认该可执行文件存在且版本符合要求;生产程序应记录命令标识和退出码,但不得记录含秘密的完整参数。

常见错误与安全注意

  • 用户输入参与命令时避免 shell=True,也不要手工拼接整条命令字符串。
  • 捕获无限输出可能耗尽内存,大数据应重定向到文件或流式处理。
  • 超时后还需考虑子进程创建的后代进程和平台差异。