You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

subprocess执行newman命令抛CalledProcessError但os.system无异常

问题解决:subprocess.check_output执行Newman命令触发CalledProcessError

问题根源

subprocess.check_output会在命令返回非0退出码时强制抛出CalledProcessError,而你的Newman命令虽然正常输出了TestRail报告URL,但返回了退出码1,因此触发了异常。os.system仅返回退出码,不会主动抛出异常,所以没有报错。

解决方案

方案1:改用subprocess.run(推荐,Python3.5+)

subprocess.run是更现代的API,能灵活捕获输出和返回码,不会主动因非0退出码抛异常,你可以自行判断是否属于正常情况:

import subprocess

# 执行命令并捕获输出
result = subprocess.run(npmCLi, shell=True, capture_output=True, text=True)
newmanCLI_output = result.stdout.strip()

# 判断返回码和输出内容
if result.returncode != 0:
    # 检查输出是否是预期的TestRail报告URL
    if "https://host.testrail.io/index.php?/runs/view/" in newmanCLI_output:
        # 属于正常输出,继续处理
        print(f"TestRail报告链接:{newmanCLI_output}")
    else:
        # 真正的执行错误,抛出异常
        raise RuntimeError(f"命令 '{result.args}' 执行失败(错误码 {result.returncode}):{result.stderr}")

方案2:保留check_output,捕获异常后判断输出

如果必须使用check_output,可以在捕获CalledProcessError后,检查输出内容是否为预期的TestRail URL,再决定是否抛出异常:

import subprocess

try:
    newmanCLI_output = subprocess.check_output(npmCLi, shell=True).decode().strip()
except subprocess.CalledProcessError as e:
    output = e.output.decode().strip()
    # 判断输出是否是TestRail报告链接
    if "https://host.testrail.io/index.php?/runs/view/" in output:
        newmanCLI_output = output
    else:
        # 非预期错误,抛出异常
        raise RuntimeError(f"命令 '{e.cmd}' 执行失败(错误码 {e.returncode}):{output}")

# 后续处理newmanCLI_output

补充说明

Newman的TestRail reporter返回非0退出码,可能是因为测试用例存在失败,或者该reporter本身的设计逻辑就是如此。你可以根据实际测试场景,调整判断条件(比如检查输出中是否包含测试失败的关键词),更精准地区分正常输出和真正的错误。

内容的提问来源于stack exchange,提问作者gabriel munteanu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:55:27