perf stat上的subprocess.communicate不会返回预期的stdout,stderr

时间:2014-11-11 01:53:48

标签: python bash python-2.7 perf

我试图使用子进程在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分析的命令输出正确返回为stdout。来自perf的统计数据应该在stderr上返回,而不是在通信后打印在屏幕上而不是保存在err变量中。

我还尝试删除shell=True,但不会更改结果。

为什么会这样?

1 个答案:

答案 0 :(得分:0)

我在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,选项