Выполнение и чтение выходных данных двоичного файла в скрипте python / bash / perl - PullRequest
1 голос
/ 16 декабря 2010

У меня есть исполняемый файл, который выполняет следующие действия: 1. выводит строку BEGIN 2. ожидает некоторого случайного времени 3. выводит строку END

Я хочу сделать следующее с python / bash / perlскрипт на MacOS:

  1. запустите упомянутую программу из командной строки
  2. , запишите время между сообщением BEGIN и сообщением END, выданным программой

как мне сделать это чисто?

Ответы [ 4 ]

1 голос
/ 16 декабря 2010

Самый простой (лучший?) Способ сделать это в 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 голос
/ 16 декабря 2010

Если вам нужна гранулярность только на целую секунду, вы можете сделать следующее "однострочное" в perl:

( 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 ).

0 голосов
/ 16 декабря 2010

Вы можете сделать это просто с помощью GAWK:

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

где exec - ваш исполняемый файл. Это хорошо, только если вам не нужна точность, более точная, чем одна секунда.

0 голосов
/ 16 декабря 2010

В Python:

Вы можете использовать модуль datetime, чтобы записать текущую временную метку до и после выполнения внешней программы, а затем вычесть две, чтобы получить время выполнения.

Вы можете выполнять внешние программы, используя модуль subprocess.

Таким образом, код будет выглядеть примерно так:

import datetime, subprocess

ts1 = datetime.datetime.now()
subprocess.Popen('/path/to/external/program')
ts2 = datetime.datetime.now()
print ts2-ts1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...