python子进程不会捕获pv命令的stderr



我需要用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进度条。(

最新更新