使用"次#34时访问stdout;在python子进程中

时间:2014-10-16 19:46:07

标签: python shell time stdout benchmarking

我一直在使用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

如果我使用timeshell=True添加回cmnd,我会得到时间输出但program实际上并未运行。

我怎样才能让两者兼顾?

1 个答案:

答案 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