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

如何在Python脚本中捕获进程的实时持续输出?

解决Python实时捕获持续运行进程的输出问题

你的问题出在subprocess.run()的使用上——这个方法会阻塞直到子进程完全退出才会返回输出,但队友的applicationAPI.py是持续运行、周期性输出的,所以永远不会触发run()的返回逻辑。

要实时捕获并解析这类持续输出,应该用subprocess.Popen,它能启动子进程并实时读取其标准输出。以下是修改后的代码:

import subprocess
import csv
import sys

# 启动子进程,实时获取输出
with subprocess.Popen(
    ['./applicationAPI.py', '-target_ip', '-username', '-password', 'metric1', 'metric2', 'metric3', '-u', '60'],
    stdout=subprocess.PIPE,
    text=True,
    bufsize=1  # 行缓冲,确保实时拿到每一行输出
) as proc:
    # 逐行读取子进程的stdout
    for line in proc.stdout:
        line = line.strip()
        if not line:
            continue  # 跳过空行
        # 解析CSV行
        reader = csv.reader([line])  # 把单行包装成列表供csv.reader处理
        for row in reader:
            print(f"解析后的指标: {row}")
            # 这里可以添加你的业务逻辑,比如把指标存入数据库、转换成JSON等

    # 检查子进程是否异常退出
    if proc.returncode != 0:
        print(f"子进程异常退出,返回码: {proc.returncode}", file=sys.stderr)

关键说明:

  • subprocess.Popen不会阻塞,启动后立即返回,允许你实时读取输出。
  • bufsize=1开启行缓冲模式,确保子进程输出一行后,你的脚本能立刻拿到,而不是等缓冲区满才输出。
  • 逐行读取proc.stdout,每次拿到一行就解析CSV,避免累积大量数据。
  • 使用with语句管理Popen对象,确保子进程能被正确清理。

如果需要在某个条件下终止子进程(比如达到指定时间、捕获到特定指标),可以在循环中添加判断,调用proc.terminate()或proc.kill()来结束进程。

内容的提问来源于stack exchange,提问作者Meme-ento

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:40:02