在python / bash / perl脚本中执行和读取二进制文件的输出

时间:2010-12-15 23:18:47

标签: python linux perl bash scripting

我有一个执行以下操作的可执行文件: 1.输出字符串BEGIN 2.等待一些随机时间 3.输出字符串END

我想在MacOS上使用python / bash / perl脚本执行以下操作:

  1. 从命令行执行前面提到的程序
  2. 记录BEGIN消息和程序输出的END消息之间的时间
  3. 我该如何干净利落地做到这一点?

4 个答案:

答案 0 :(得分:1)

在bash中执行此操作的最简单(最好?)方法是调用date并以秒为单位输出它的时间。 timer.sh脚本将调用您的可执行文件(randbegend.sh用于我的测试目的),然后查找BEGIN和END行以触发日期调用。一旦您的可执行文件退出,timer.sh将计算并显示以秒为单位的时间增量。

timer.sh

#!/bin/bash

while read line; do
  if [[ "$line" == "BEGIN" ]]; then
    t1=$(date "+%s")
    echo t1=$t1
  elif [[ "$line" == "END" ]]; then
    t2=$(date "+%s")
    echo t2=$t2
  fi
done < <(./randbegend.sh) # Change this to call your executable

echo "delta = $((t2 - t1)) seconds"

randbegend.sh

#!/bin/bash

sleep $((RANDOM % 5))
echo BEGIN
sleep $((RANDOM % 10))
echo END

输出

$ ./timer.sh
t1=1292451820
t2=1292451825
delta = 5 seconds

$ ./timer.sh
t1=1292451886
t2=1292451889
delta = 3 seconds

$ ./timer.sh
t1=1292451896
t2=1292451903
delta = 7 seconds

答案 1 :(得分:1)

如果您只想要全秒级粒度,可以在perl中执行以下“one-liner”:

( echo BEGIN ; sleep 3s ; echo END ) | \
    perl -ne 'print $_; if (/BEGIN/) { $begin_time = time(); } if (/END/) { $t = time()-$begin_time; print "time was : $t seconds" }'

产地:

BEGIN
[ 3 second delay ]
END
time was : 3 seconds

你可以在命令行执行我的( echo BEGIN ; sleep 3s ; echo END )

答案 2 :(得分:0)

在Python中:

您可以使用datetime模块记录当前时间戳,在执行外部程序之前和之后,然后减去两个以获得执行时间。

您可以使用subprocess模块执行外部程序。

所以代码看起来像是:

import datetime, subprocess

ts1 = datetime.datetime.now()
subprocess.Popen('/path/to/external/program')
ts2 = datetime.datetime.now()
print ts2-ts1

答案 3 :(得分:0)

你只需使用GAWK就可以做到:

exec | gawk '{if ($1 == "BEGIN") {t1 = systime()} else if ($1 == "END") {t2 = systime()}} END{print t2-t1" sec"}'

其中exec是您的可执行文件。只有当您不需要精确度超过一秒的精度时,这才是好的。