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

如何使用subprocess.Popen同时捕获stdout与stderr并合并为单一输出

Python subprocess 实时合并采集标准输出与错误输出方案

核心实现方法

直接在初始化subprocess.Popen对象时,通过参数将stderr流重定向到stdout管道,即可从同一个输出句柄读取所有输出内容,无需分别处理两个独立流,同时完全保留实时逐行读取的能力,适配CI平台实时传输、分析日志的需求。

修正后的可直接运行代码如下:

import subprocess

process = subprocess.Popen(
    ["/bin/bash", "script.sh"],
    stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT, # 核心配置:将错误输出重定向到标准输出管道
    text=True, # 直接返回字符串类型,无需手动解码字节流,Python3.7以下版本替换为universal_newlines=True
    bufsize=1 # 开启行缓冲,避免输出延迟,保证实时性
)

while True:
    output_line = process.stdout.readline()
    # 修复原代码bug:poll是可调用方法,必须加()执行才能拿到进程状态
    if process.poll() is not None and output_line == "":
        break
    if output_line:
        # 此处拿到的output_line已同时包含该行对应的标准输出/错误输出内容,可直接做传输、解析处理
        print(output_line.strip())

# 进程结束后可通过return_code拿到脚本执行退出码,用于CI任务结果判定
exit_code = process.returncode

注意事项

  • 该方案的流合并由操作系统层面完成,输出顺序和脚本在终端直接执行的展示顺序一致,不会出现两个流独立缓冲导致的日志顺序错乱问题。
  • 不要用process.communicate()方法做实时采集,该方法会等进程完全退出后才返回全部输出,无法满足实时传输的要求。
  • 若运行环境存在中文或其他非英文输出,text=True参数会自动采用系统默认编码解码,避免乱码问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:36:19