在Jupyter Notebook中执行jq命令查找JSON的status:failed报错求助
问题解决方法
你的代码主要存在以下几个问题:
- 使用
subprocess.check_output并设置shell=True时,命令需传入单个字符串,而非列表(列表格式是shell=False时的用法,混用会触发语法错误)。 - 命令里的
&&是HTML转义字符,实际应替换为&&;同时引号嵌套混乱,导致shell解析失败。 - 路径缺少根目录前缀,正确路径应为
/Users/avinash/Downloads/reports/reports
修正后的代码(保留原命令逻辑)
import subprocess # 将整个命令作为单个字符串,用单引号包裹外层避免引号冲突 cmd = '''cd /Users/avinash/Downloads/reports/reports && jq -r '.' *.json | jq '(.steps) |= []' | grep -c '"status": "failed"' ''' # 添加text=True让结果直接返回字符串,无需手动解码 result = subprocess.check_output(cmd, shell=True, text=True) print(f"匹配到的失败条目数:{result.strip()}")
更高效的优化方案(用jq直接统计,无需grep)
可以让jq完成过滤和计数操作,减少管道依赖,同时避免引号嵌套问题:
import subprocess cmd = '''cd /Users/avinash/Downloads/reports/reports && jq -n '[inputs | del(.steps) | select(.status == "failed")] | length' *.json ''' result = subprocess.check_output(cmd, shell=True, text=True) print(f"匹配到的失败条目数:{result.strip()}")
说明:
inputs:jq处理多个输入文件的内容del(.steps):移除steps字段,和原命令的(.steps) |= []效果一致select(.status == "failed"):筛选status为failed的条目[... ] | length:将符合条件的条目存入数组后统计长度,直接得到总数
内容的提问来源于stack exchange,提问作者Avinash jain
相关产品推荐
相关产品推荐

