python - 使用python获取pv的输出

标签 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 的最后一个进度报告。有人知道我怎样才能让它打印不断更新的状态吗?

最佳答案

结果是 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

关于python - 使用python获取pv的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39274976/

相关文章:

python - 在 pygame 中实现 Rect 对象和球之间的碰撞检测功能

python - networkx - 根据列表或字典值更改节点大小

python - 使用Python将表加载到AWS RDS Postgres需要花费很多时间

python - Python:使用xmllint时,子进程通信会不确定地等待

python - 为什么带有 shell=True 的 subprocess.Popen() 在 Linux 和 Windows 上的工作方式不同?

python - 如何在 tox 中只运行一个测试?

python - 计数和突出显示出现问题

python - 使用子进程的PIPE时如何将python对象<class '_io.TextIOWrapper'>的内容作为字符串获取?

python - 如何用自定义字符串完全替换 pytest 输出以进行测试?

Python子进程引入空格