如何在Python中仅捕获/usr/bin/time输出,排除命令自身stderr?
当被执行的命令自身输出stderr时,如何仅捕获/usr/bin/time的输出?
当前使用的代码:
import subprocess print(subprocess.run('/usr/bin/time -p foo', capture_output=True, shell=True).stderr.decode())
执行后输出:
foo_stderr real 0.02 user 0.01 sys 0.00
已知以下两种方案不考虑:
- 将输出写入文件(例如GNU
time --output file) - 处理捕获的输出以筛选出相关数据
解决方案:重定向目标命令的stderr
通过在shell命令中将目标命令foo的stderr单独重定向,避免其污染/usr/bin/time的输出。具体用子shell包裹foo,并将其stderr重定向到/dev/null:
import subprocess # 仅保留/usr/bin/time的stderr输出,丢弃foo的stderr result = subprocess.run('/usr/bin/time -p sh -c "foo 2>/dev/null"', capture_output=True, shell=True) print(result.stderr.decode())
执行后只会输出/usr/bin/time的计时内容:
real 0.02 user 0.01 sys 0.00
原理说明
/usr/bin/time会将计时结果写入自身的stderr,而目标命令foo的stderr默认会与前者的输出混合。通过sh -c "foo 2>/dev/null",我们直接丢弃foo的stderr输出,这样subprocess捕获到的stderr就只有/usr/bin/time的内容了。
内容的提问来源于stack exchange,提问作者Semnodime
相关产品推荐
相关产品推荐

