【发布时间】:2018-03-01 21:14:07
【问题描述】:
我想计算在 python 脚本中执行 c 程序所需的时间。我为此使用了 os.system() 函数。
os.system("{ time ./test.out < inp;} > out 2> exe_time")
- test.out 是我的 c 可执行文件
- inp 包含 c 的输入
- out存储c程序的输出
- exe_time 存储程序的执行时间。
我在 exe_time 中得到的结果是这样的
0.00user 0.00system 0:00.00elapsed ?%CPU (0avgtext+0avgdata 1416maxresident)k 0inputs+8outputs (0major+65minor)pagefaults 0swaps
但是当我在终端执行 { time ./test.out out 2> exe_time 时,我进入了 exe_time 文件
真正的 0m0.001s
用户 0m0.000s
系统 0m0.000s
如何使用 python 获得第二个版本的输出?
【问题讨论】:
-
您从交互式 shell 中的
sh -c '{ time ./test.out < inp;} > out 2> exe_time'得到什么?这就是system()正在做的事情:它调用/bin/sh,而不是 bash 或 zsh 或任何您的交互式 shell。 -
如果你想要bash提供的
time的实现,不要使用system();而是使用subprocess.Popen(['bash', '-c', '{ time ./test.out < inp;} > out 2> exe_time'])之类的东西明确地指定 bash。 -
...或者,更安全(如果您的文件名或参数不是常量):
subprocess.Popen(['bash', '-c', 'in=$1; shift; out=$1; shift; err=$1; shift; { time "$@" < "$in";} > "$out" 2> "$err"', '_', 'inp', 'out', 'exe_time', './test.out'])从代码中带外传递参数。
标签: python linux shell time subprocess