运行外部命令并获取其消耗的CPU量

Noa*_*ith 6 python

非常简单,我想从Python脚本中运行一个外部命令/程序,一旦完成,我还想知道它消耗了多少CPU时间.

硬模式:并行运行多个命令不会导致CPU消耗结果不准确.

Ale*_*x I 12

在UNIX上:(a)使用资源模块(也见icktoofay的回答),或(b)使用time命令解析结果,或(c)使用/ proc文件系统,解析/ proc/[pid]/stat和解析utimestime字段.其中最后一个是特定于Linux的.

使用示例resource:

import subprocess, resource
usage_start = resource.getrusage(resource.RUSAGE_CHILDREN)
subprocess.call(["yourcommand"])
usage_end = resource.getrusage(resource.RUSAGE_CHILDREN)
cpu_time = usage_end.ru_utime - usage_start.ru_utime
Run Code Online (Sandbox Code Playgroud)

注意:没有必要执行fork/execvp,subprocess.call()或者其他子进程方法在这里很好并且更容易使用.

注意:您可以使用subprocess.Popen或subprocess.call和threads同时从同一个python脚本运行多个命令,但是资源不会返回正确的单个cpu时间,它将返回它们在getrusage调用之间的时间总和; 为了获得单独的时间,每个命令运行一个小的python包装器,如上所述计时(可以从主脚本启动它们),或者使用time下面的方法,它可以正常使用多个同时命令(时间基本上就是这样的包装器) .

使用示例time:

import subprocess, StringIO
time_output = StringIO.StringIO()
subprocess.call(["time", "yourcommand", "youroptions"], stdout=time_output)
# parse time_output
Run Code Online (Sandbox Code Playgroud)

在Windows上:您需要以某种方式使用性能计数器(也称为"性能数据助手").这是底层API 的C示例.要从python中获取它,您可以使用以下两个模块之一:win32pdh(pywin32的一部分; 示例代码)或pyrfcon(跨平台,也适用于Unix; 示例代码).

这些方法中的任何一种实际上都满足上述"硬模式"要求:即使在繁忙系统上有多个不同进程的运行实例,它们也应该是准确的.与在空闲系统上仅运行一个进程相比,它们可能无法产生完全相同的结果,因为进程切换确实有一些开销,但它们将非常接近,因为它们最终从OS调度程序获取数据.