我试图使用子进程在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
,但不会更改结果。
为什么会这样?
答案 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,
选项