首先:我建议不要
perf在您的python进程中进行调用(如您在下面的任务的复杂性中所看到的),而是使用从命令行进行:
sudo perf stat -- python test.py
如果您 真的 想从python中调用perf,那么您将面临一些棘手的问题:
- 终止
perf
并使其输出收集的性能统计信息,您需要向其发送SIGINT
信号(尝试使用sudo perf stat -p mypid
:ctrl-
将不打印任何内容,而ctrl-c
将打印) - 您需要捕获,
stderr
因为perf将其输出发送到stderr
(至少在我的版本中) - 您需要使用
fork()
一个进程发送SIGINT
,而另一进程在进程终止时读取它的输出。如果没有fork,它将无法正常工作,因为在您执行SIGINT
了该perf
过程之后,您将无法再从stdin中读取该过程,因为该进程已经消失了,而当您从头stdin
开始读取该文件时,直到perf被正确终止,您将无法获得任何输出。
这意味着您将最终获得此python程序:
import subprocessimport osimport signalimport timeperf = subprocess.Popen(['perf', 'stat', '-p', str(os.getpid())], stderr=subprocess.PIPE)# <-- your pre goes hereif os.fork() == 0: # child time.sleep(1) # wait until parent runs `stderr.read()` perf.send_signal(signal.SIGINT) exit(0)# parentprint("got perf stats>>{}<<".format(perf.stderr.read().depre("utf-8")))
该
time.sleep(1)位是丑陋的,它做什么它,它会,但我想它会做的伎俩为99%的情况。它几乎对perf数据没有影响,唯一的影响是对“总运行时间”(
*xxseconds time elapsed)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)