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,也不要手工拼接整条命令字符串。 - 捕获无限输出可能耗尽内存,大数据应重定向到文件或流式处理。
- 超时后还需考虑子进程创建的后代进程和平台差异。