У меня есть исполняемый файл, который выполняет следующие действия: 1. выводит строку BEGIN 2. Подождите некоторое время 3. выводит строку END
Я хочу сделать следующее с помощью python/ bash/perl script в MacOS:
как я могу сделать это чисто?
Самый простой (лучший?) способ сделать это в bash - просто вызвать date
и вывести его время в секундах. timer.sh
script будет вызывать ваш исполняемый файл (randbegend.sh
для моих целей тестирования), а затем искать линии BEGIN и END, чтобы вызвать вызов на дату. После завершения вашего исполняемого файла 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"
#!/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
Если вы хотите только детализацию всего-второго, вы можете сделать следующий "однострочный" в 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 )
.
Вы можете сделать это просто с помощью GAWK:
exec | gawk '{if ($1 == "BEGIN") {t1 = systime()} else if ($1 == "END") {t2 = systime()}} END{print t2-t1" sec"}'
где exec
- ваш исполняемый файл. Это хорошо, только если вам не нужна точность, более точная, чем одна секунда.
В Python:
Вы можете использовать модуль datetime
, чтобы отметить текущую временную метку до и после выполнения внешней программы, а затем вычесть их для получения времени выполнения.
Вы можете выполнять внешние программы с помощью модуля subprocess
.
Итак, код будет выглядеть примерно так:
import datetime, subprocess
ts1 = datetime.datetime.now()
subprocess.Popen('/path/to/external/program')
ts2 = datetime.datetime.now()
print ts2-ts1