从字符串执行命令并对其计时

executing a command from a string and timing it

我需要编写一个脚本来接收多个参数,其中最重要的一个
是一个包含命令的字符串(在 linux 中)。

我需要能够 运行 它,将输出保留在 STDOUT 中(通常),但也要计时,然后输出一些 .csv 文件。

说它看起来像这样:

timing_script.py param "echo hello world; cat /tmp/foo_bar"

该命令每隔几毫秒就会将内容输出到 STDOUT,我需要它留在那里。我这么说是因为我之前尝试使用此脚本是在 bash 中,我不得不从 time 命令中 cut 来实际计时,这也意味着必须忽略输出命令。

我还必须将 param,0.345 之类的内容附加到 csv 文件。

如何从字符串执行命令并为其计时?

您可以使用 subprocess 到 运行 linux 来自字符串的命令和 time 来计算执行时间:

import time
from subprocess import Popen, PIPE

start = time.time()

p1 = Popen(["my_linux_cmd"], stdout=PIPE)
print(p1.communicate()) # sdout

end = time.time()
exec_time = end - start
print(exec_time) # exeution time

检查 subprocess.Popen 以获取有关可用选项的更多详细信息

警告: 打印标准输出你也可以使用 Popen.stdout.read 但使用 communicate() 而不是避免死锁 由于任何其他 OS 管道缓冲区填满并阻塞子进程。

留在 shell 中的一种更简单的方法是使用 time 命令的格式化选项 -f。你可以这样使用它:

$ param="foo"
$ command="echo bar ; cat /tmp/foobar"
$ /usr/bin/time -f "$param,%e" bash -c "$command"
bar
#Beginning of foobar file
#End of foobar file
foo,0.00

请查看 man time 以获取有关格式化 time

输出的更多示例

当然你也可以直接运行下面的命令(即不使用变量):

/usr/bin/time -f "myparam,%e" bash -c "echo bar ; cat /tmp/foobar"

玩得开心