我一直在使用time
命令在我的shell中进行一些手动基准测试。我想通过编写一个python脚本来扩展我的基准测试,该脚本既自动化测试又能让我访问时间数据,这样我就可以用我选择的格式(可能是csv)来记录它。我看到有timeit
模块,但这似乎更适合基准测试python代码,我在这里尝试基准测试的是在命令行中运行的程序。
这是我一直在手动做的事情:
time program -aflag -anotherflag
我最初尝试在脚本中实现此功能,如下所示:
cmnd = ['time', 'program', 'aflag', 'anotherflag']
p = subprocess.Popen(cmnd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate
print out
print err
我可以正常访问time
的输出 - 这是传递给stderr的,但是我没有像stdout中那样得到program
的输出。如果我从time
删除cmnd
并将shell=False
更改为True,那么我会在stdout中获取程序的输出 - 但显然不是time
的输出,这是整点
cmnd = ['program', 'aflag', 'anotherflag']
p = subprocess.Popen(cmnd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate
print out
print err
如果我使用time
将shell=True
添加回cmnd,我会得到时间输出但program
实际上并未运行。
我怎样才能让两者兼顾?
答案 0 :(得分:2)
为什么不在resource
模块中使用Python内置的功能,而不是试图让它工作?
import resource
import subprocess
cmd = ['program', 'aflag', 'anotherflag']
p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
usage = resource.getrusage(resource.RUSAGE_CHILDREN)
print out
print err
print usage.ru_utime, usage.ru_stime, usage.ru_utime+usage.ru_stime
如果您需要区分同时运行的不同子进程,getrusage
显然不够用。在这种情况下,您需要使用wait4
或类似内容来获取每个进程的资源使用情况。这使您Popen
的使用更加复杂。你可能想要为这种情况做的是子类或叉subprocess
代码(但如果你在3.1或更早版本,请务必使用subprocess32
backport来避免{{1}中的错误 - 以及该类实际上具有您想要挂钩的方法...)并更改the _try_wait
method以使用communicate
而不是wait4
并将额外的结果存储在,例如{{} 1}}所以你以后可以访问它。
我认为这样的事情会起作用:
waitpid