症状
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 调用已知可用命令的单元测试,防止回归。