← 中文资源

简体中文版本

Python subprocess.CalledProcessError: 返回非零退出码

通过捕获 stderr、检查退出码来诊断 subprocess.CalledProcessError,并只在失败应中断时使用 check=True。

阅读英文原文

症状

subprocess.CalledProcessError 抛出,但异常信息里看不到子进程实际输出的内容。同样的命令在终端手动执行却正常,说明环境或参数存在差异。

诊断

捕获输出,让子进程自身的错误显现出来:

try:
    subprocess.run(['make', 'build'], capture_output=True, text=True, check=True)
except subprocess.CalledProcessError as exc:
    print('rc', exc.returncode)
    print(exc.stderr)

将 os.getcwd() 与 os.environ['PATH'] 同终端做对比。

修复

以列表传参,显式设置环境与工作目录,并暴露 stderr:

result = subprocess.run(
    ['git', 'rev-parse', 'HEAD'],
    capture_output=True, text=True, check=True,
    cwd=repo_path, env=clean_env,
)
print(result.stdout)

验证

重新执行,确认退出码为 0 且 stdout 符合预期。补充一个以 check=True 调用已知可用命令的单元测试,防止回归。