csv 在脚本中处理实时流程输出数据?

wgeznvg7  于 2023-06-27  发布在  其他
关注(0)|答案(1)|浏览(118)

我试图弄清楚如何在Python中处理进程的实时,持续的输出。我的队友给了我一个脚本,我们称之为applicationAPI.py,它做了以下事情:
1.建立到主机设备TCP连接
1.定义要从主机设备上的应用程序提取的多个指标
1.在定义的时间间隔内以CSV格式LIVE将这些指标输出到我的stdout,在本例中每60秒一次。
我试图做的是从这个过程中捕获这个实时输出数据,并在我自己的python脚本中解析它。我尝试使用子进程与以下

import subprocess
import csv
import json

api_call = subprocess.run(['./applicationAPI.py', '-target_ip', '-username', 
'-password', 'metric1', 'metric2', 'metric3', '-u', '60'], capture_output=True, text=True, check=True)

api_response = (api_call.stdout)
f = StringIO(api_response)
reader = csv.reader(f)
for line in reader:
    print(line)

但没有用。问题是这个过程还在进行中。在60秒的时间间隔内,它将继续向stdout输出数据。但它从不返回返回代码或完成执行。我试着只重定向到一个文件,但同样,因为它的过程相同,输出文件只会不断增长。我不知道如何捕获或操作这些数据以便在脚本中解析它。

mlnl4t2r

mlnl4t2r1#

您可以使用较低级别的Popen类,它提供了stdoutstderr管道来读取。启动进程时重定向文件的stderr,然后从stdout读取csv信息,直到进程完成。最后等待进程结束并读取返回代码。

import subprocess
import csv
import json
import tempfile

with tempfile.TemporaryFile() as stderr_file:

    api_call = subprocess.Popen(['./applicationAPI.py', '-target_ip', '-username',
        '-password', 'metric1', 'metric2', 'metric3', '-u', '60'],
        stdout=subprocess.PIPE, stderr=stderr_file)
    for row in csv.reader((line.decode() for line in api_call.stdout)):
        print(row)
    api_call.wait()
    if api_call.returncode != 0:
        stderr_file.seek(0)
        print(stderr_file.read())

这不是真实的的时间因为您使用的是管道,而不是终端,所以程序将缓冲stdout。您将只看到块大小边界上的输出(可能每2048字节,但取决于系统)。有时程序包含一个标志,告诉它刷新每个换行符上的stdout。也许这个计划有一个或它可以实施?

相关问题