python 子进程不捕获 pv 命令的标准错误

python subprocess does not capture stderr of a pv command

我需要 运行 一些带有 python 的 bash 脚本并显示输出。其中一些脚本包含一些 pv 命令,但是从 subprocess 我无法获得 pv 输出。

import subprocess as sp

p = sp.Popen(["./script.sh"], shell=False, bufsize=1, stdout=sp.PIPE, stderr=sp.STDOUT, universal_newlines=True)

p.wait()

print(p.returncode)
print(p.stdout.read())
#!/bin/bash

set -e

echo "aaa"
echo "bbb" >&2

pv -L 1000 -F "%t %b %r %e" /path/to/some/file | cat > /tmp/foo

运行这个 python 脚本我只得到 echo 的输出:

$ python script.py 
0
aaa
bbb

pv 对终端中是否为 运行 敏感。如果你想捕获它的输出,使用 pv -f 选项强制它显示进度指示器,即使它没有连接到终端。

对于更复杂的场景,您可能必须使用类似 pty 的东西在终端下模拟 运行。

(当然,你最好使用像 tqdm 这样的原生 Python 进度条。)