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的主要内容,如果未能解决你的问题,请参考以下文章

理解 perf stat 输出中的数字

如何使用 perf stat 计算 MIPS

perf 报告单个睡眠的多个 sched:sched_stat_sleep 事件

perf stat 前端和后端周期显示大于 100%

如何获取使用 perf stat 运行的程序的退出代码?

KVM虚拟机使用Perf stat 提示cycles not supported