为了账号安全,请及时绑定邮箱和手机立即绑定

子进程 check_output 减少我的输出

子进程 check_output 减少我的输出

猛跑小猪 2021-11-30 18:37:25
我必须使用以下方法编写几个 C 程序在多个文件上运行所需的时间:time ./program filename到一个电子表格,我正在使用subprocess.check_output它stdout作为一个字符串。我应该得到一些类似的东西:real    0m0.001suser    0m0.001ssys     0m0.000s但我得到:b'0.00user 0.00system 0:00.00elapsed ?%CPU (0avgtext+0avgdata 1388maxresident)k\n0inputs+0outputs (0major+60minor)pagefaults 0swaps\n'我看到用户和系统时间,但它们在小数点后两位后被截断。有没有办法确保输出读取所有 3 个小数位?这是我的代码:import xlwtimport subprocessfiles = ('100KB.txt', '1MB.txt', '10MB.txt', '100MB.txt')programs = ('./10kBuffer', './step2', './step3', './step4')command = ['time', programs[0], files[0]]out = subprocess.check_output(command, stderr=subprocess.STDOUT)print(out)
查看完整描述

1 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

那是因为 GNUtime使用默认格式字符串,更详细,但您需要-p选项。


引用手册:


默认格式字符串是:


%Uuser %Ssystem %Eelapsed %PCPU (%Xtext+%Ddata %Mmax)k %Iinputs+%Ooutputs (%Fmajor+%Rminor)pagefaults %Wswaps


当给出 -p 选项时,使用(便携式)输出格式:


real %e

user %U

sys %S

您还需要对输出进行解码,否则您将得到bytes而不是str,并且不会解释换行符。前任:


>>> print(b'hello\nworld\n')

b'hello\nworld\n'

>>> print('hello\nworld\n')

hello

world

所以我会按原样修复您的代码:


command = ['time', '-p', programs[0], files[0]]

out = subprocess.check_output(command, stderr=subprocess.STDOUT)

print(out.decode())

编辑:另一个答案似乎有助于通过使用内置的 shell 来修复丢失的小数。您可以混合两个答案以获得所需的字符串输出,并带有足够的小数。


请注意,除非您想对命令使用分析器,否则您似乎无法做得更好(请参阅如何获取 Python 程序的执行时间?)


查看完整回答
反对 回复 2021-11-30
  • 1 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信