使用python获取pv的输出

jun*_*er- 5 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)
Run Code Online (Sandbox Code Playgroud)

但我无法从 获得连续输出p0。我试过:

    for line in p0.stderr:
        print("line:", line)
Run Code Online (Sandbox Code Playgroud)

但这会等待该过程完成,然后仅打印来自的最后一个进度报告pv。有谁知道我怎样才能让它打印不断更新的状态?

jun*_*er- 1

事实证明,pv输出的每一行末尾都有一个回车符 ( \r)。为了能够连续读取输出,Popen需要使用 进行初始化universal_lines=True,如下所示:

    p0 = sp.Popen(['pv', '-f', args.filepath],
                    stdout=sp.PIPE,
                    stderr=sp.PIPE,
                    universal_newlines=True)
Run Code Online (Sandbox Code Playgroud)

这导致进度报告的连续输出:

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
Run Code Online (Sandbox Code Playgroud)

这是对类似问题的参考:

subprocess.popen() 的实时输出,而不是逐行输出