【问题标题】:executing a command from a string and timing it从字符串执行命令并计时
【发布时间】:2015-12-22 09:26:46
【问题描述】:

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

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

说它看起来像这样:

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

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

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

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

【问题讨论】:

  • bash -c "time test_command" >/tmp/logfile 2>&1 & 然后是head -n -4 < /tmp/logfile > /tmp/stdout-err tail -n 4 < /tmp/logfile > /tmp/timing-data
  • @anishane :看起来像是一个矫枉过正的建议。另外,在不必要时使用临时文件可能会导致意外行为(只需考虑使用不同的“test_command”多次运行命令)

标签: python linux bash csv timing


【解决方案1】:

您可以使用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(),而不是避免由于以下任何原因导致的死锁其他操作系统管道缓冲区填满并阻塞子进程。

【讨论】:

    【解决方案2】:

    保留在 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"
    

    玩得开心

    【讨论】:

    • 您所说的time 命令是/usr/bin/time 通常在我的工作环境中所缺少的命令...这是我编写原始bash 脚本时遇到的问题之一。我拥有的time 是unix 中的内置时间。
    • 是的,没错。我相应地修改了我的答案。如果您无法使用/usr/bin/time ...您可以选择 Python :)。我让我回答是因为你有/usr/bin/time的人可能会感兴趣。
    • 确实如此。无论如何感谢您的回答,希望您的编辑对某人有所帮助:)
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2014-03-12
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多