如何从/ usr / bin / time -v接收输出?

时间:2017-04-16 14:44:25

标签: python time subprocess

我在C ++中实现了一个算法,在实现中我计算了一些统计信息,比如缓存未命中,指令,分支未命中等。这些信息最后用cout打印出来。但是,我还想知道实现使用了多少空间。我使用subprocess如下:

result = subprocess.check_output(['/usr/bin/time', '-v','./program',input])

很遗憾,只有./program的输出存储在result中,而不是/usr/bin/time的输出。以下是/usr/bin/time的一个可能输出:

User time (seconds): 3.41
    System time (seconds): 0.06
    Percent of CPU this job got: 99%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.48
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 344016
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 72338
    Voluntary context switches: 1
    Involuntary context switches: 6
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

我只对Maximum resident set size (kbytes):感兴趣。如果我能以某种方式将这个大文本存储在result中,那么我希望我可以解析它。但输出完全不存储在result中,只是打印出来。解决这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

time输出到STDERR,因此您需要将其重定向到STDOUT,或单独捕获它。来自time command manpage

  

命令完成后,时间 将消息写入标准错误 ,提供有关此程序运行的时间统计信息。

粗体斜体 强调我的。

使用stderr=subprocess.STDOUT重定向:

result = subprocess.check_output(
    ['/usr/bin/time', '-v', './program', input],
    stderr=subprocess.STDOUT)

或使用subprocess.run()分别捕获两个流:

result = subprocess.run(
    ['/usr/bin/time', '-v', './program', input],
    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout = result.stdout
time_output = result.stderr

subprocess.run()是Python 3.5及更高版本中的新功能;如果您有较旧的Python版本(并考虑升级ASAP),请直接使用subprocess.Popen()

process = subprocess.Popen(
    ['/usr/bin/time', '-v', './program', input],
    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, time_output = process.communicate()