有没有办法在python中使用程序pv以获得操作的进度?
到目前为止,我有以下内容:
p0 = sp.Popen(["pv", "-f", args.filepath],
bufsize=0,
stdout=sp.PIPE,
stderr=sp.PIPE)
p1 = sp.Popen(["awk", "{print $1, $2, $1, $3, $4 }", "{}".format(args.filepath)],
stdout=sp.PIPE,
stdin=p0.stdout)
但是我无法从p0
获得连续输出。我试过了:
for line in p0.stderr:
print("line:", line)
但是等待该过程完成,然后只打印pv
的最后一个进度报告。有人知道如何让它打印持续更新状态吗?
答案 0 :(得分:1)
结果是pv
输出每一行,最后一个回车符(\r
)。为了能够从输出中连续读取,需要使用Popen
初始化universal_lines=True
,如下所示:
p0 = sp.Popen(['pv', '-f', args.filepath],
stdout=sp.PIPE,
stderr=sp.PIPE,
universal_newlines=True)
这导致持续输出进度报告:
line: 7.12MB 0:00:01 [ 7.1MB/s] [=> ] 8% ETA 0:00:11
line: 14.6MB 0:00:02 [7.42MB/s] [====> ] 16% ETA 0:00:10
line: 22.1MB 0:00:03 [7.55MB/s] [=======> ] 24% ETA 0:00:09
line: 29.5MB 0:00:04 [7.36MB/s] [==========> ] 33% ETA 0:00:08
以下是对类似问题的引用:
答案 1 :(得分:0)
尝试从p0.stderr
阅读pv使stdout不受影响,它只写入stderr