使用python

时间:2016-09-01 15:00:23

标签: python subprocess

有没有办法在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的最后一个进度报告。有人知道如何让它打印持续更新状态吗?

2 个答案:

答案 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

以下是对类似问题的引用:

Real time output of subprocess.popen() and not line by line

答案 1 :(得分:0)

尝试从p0.stderr

阅读

pv使stdout不受影响,它只写入stderr