perf stat 上的 subprocess.communicate 未返回预期的 stdout、stderr
Posted
技术标签:
【中文标题】perf stat 上的 subprocess.communicate 未返回预期的 stdout、stderr【英文标题】:subprocess.communicate on perf stat does not return expected stdout, stderr 【发布时间】:2014-11-11 01:53:48 【问题描述】:我试图在 Python 中使用子进程运行 perf stat。 我注意到一个我认为很奇怪的行为,这是代码:
import subprocess
cmd="perf stat -e cache-misses echo stdout"
p = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
out,err = p.communicate()
print "OUT",out
print "ERR",err
这是输出:
Performance counter stats for 'echo stdout':
1,759 cache-misses
0.000868593 seconds time elapsed
OUT stdout
ERR
由 perf 分析的命令的输出正确地返回为标准输出。来自 perf 的统计信息应该在 stderr 上返回,而不是在通信后打印在屏幕上而不是保存在 err 变量中。
我也尝试删除shell=True
,但它不会改变结果。
为什么会这样?
【问题讨论】:
What stream does perf use? 似乎相关。 试试perf stat -x, -e ...
。 -x 标志产生机器可读的输出。 perf.wiki.kernel.org/index.php/Tutorial#Counting_with_perf_stat
@John Zwinck 我正在使用性能版本 3.2.63。
@Himal 感谢您的链接,这确实解决了我的问题,但我不确定那里发生了什么。 perf 输出应该在 stderr 或 stdout 上,否则我不会在终端上看到它。为什么没有被子进程捕获?
【参考方案1】:
我在 Ubuntu 14.10 上尝试了以下方法,它似乎有效。输出将在stderr_output
:
import subprocess
if __name__ == '__main__':
cmd = ['perf', 'stat', '-x,', '-e', 'cache-misses', 'echo', 'stdout']
print 'cmd:', cmd
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout_output, stderr_output = process.communicate()
print "\nOutput:"
print stdout_output,
print '\nError:'
print stderr_output
讨论
我将命令拆分为一个列表,它可以工作,将其保留为一个字符串,它不会 我不必使用shell=True
如果您不想要机器可读的输出,请删除 -x,
选项
【讨论】:
您使用的是哪个版本的 perf? 我在工作中无法查看,但我昨晚安装了。以上是关于perf stat 上的 subprocess.communicate 未返回预期的 stdout、stderr的主要内容,如果未能解决你的问题,请参考以下文章