如何在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
相关产品推荐
相关产品推荐

