AI 写的小工具接管道就解析失败,怎样把数据输出和进度提示分开
把唯一可解析的业务结果写到stdout,进度与错误写到stderr,失败时返回非零退出码。这样下游可以单独读取JSON,不会被“正在加载”一类提示破坏管道。附件同时保留一个会污染stdout的坏例子。
先确认下游收到的实际字节
broken-cli.py先输出loading,再输出JSON,单独运行看起来友好,交给json.loads却不是一个合法JSON文档。问题不是JSON对象内部字段错误,而是前面多出了一行文本。不要让下游随便跳过第一行“修复”,因为进度条行数或SDK日志变化后还会失败。先捕获完整stdout,确认业务协议规定的是一整个JSON值还是逐行记录。
数据与诊断各有出口
stats-cli.py从标准输入读取CSV的amount列,将总额与记录数编码成一个JSON对象写stdout;loaded数量写stderr。样例12、18、25合计55、记录数3。脚本里的业务计算和CLI异常处理可以继续拆分成库函数,但任何库的调试print都不能悄悄污染调用方约定的结果流。需要逐条输出时,应另行定义JSONL协议,不能把多个独立JSON随意连在一起。
同时捕获双流和退出码
run.py通过subprocess独立获取stdout、stderr和returncode,再解析成功结果,capture.json保存完整对照。读者也可以把sample.csv重定向给stats-cli.py,观察终端上仍会出现诊断,但程序接到的stdout只有JSON。图形终端可能把双流混在同一个窗口显示,因此肉眼看到几行文本不代表它们来自同一条流,必须分别捕获确认。
失败不能留下伪成功对象
失败命令传入非数字amount,应得到退出码2、空stdout和明确stderr,不能返回total为零假装成功。空输入同样不能代表零条有效业务记录已经顺利完成。本文没有模拟所有系统中断;若处理大量文件,写入中断后的部分结果需要额外原子保存或明确标记。这个包只演示本地合成CSV工具,不执行模型调用;接入真实AI生成脚本时,还要检查它依赖的第三方库是否会向stdout打印额外内容。
实际管道可先将标准输出重定向到文件,再单独查看标准错误,确认结果文件只有一个完整对象。不要为了让命令行看起来安静而吞掉异常,退出码与诊断仍要保留;若下游忽略退出码,也可能把上一轮旧文件当成这次新结果。
下载与复现
下载完整样例包,解压到一个新文件夹;也可查看全部文件清单和主脚本。使用Python 3.10或更新版本,在解压目录运行。此脚本只使用标准库,无需安装额外包。
python -B run.py
python -B run.py --negative
先查看主要结果,再修改输入重跑;已有输入会保留,结果写回同目录。边界命令可能故意非零退出,也可能输出明确的不适用状态,按正文说明判断,不把所有非零退出都当成安装故障。
依据与延伸阅读
资料核对日期为2026年10月24日。一手资料1:stdout与stderr是分开的文本流,支持将机器输出和诊断分开。
相关参考2:csv模块读取逻辑记录;本例对输入列与数值另作本地检查。
继续阅读:把回复变成脚本能解析的 JSON:codex exec —output-schema 实战;AI 生成的 Notebook 有结果却重跑失败,怎样从空内核得到同一份分析;CSV 一条备注里有多行文字,怎样分批交给 AI 又不把记录拆断。
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。