2015-12-22 1 views
0

Мне нужно написать скрипт, который получит несколько параметров, из которых самый важный
Является строкой, содержащей команду (в Linux).Выполнение команды из строки и ее время

Мне нужно иметь возможность запускать его, сохранять вывод в STDOUT (обычном), но также время его и позже выводить некоторый CSV-файл.

Скажите, что это выглядит примерно так:

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

Команда будет выводить материал на STDOUT каждые несколько миллисекунд, что мне нужно, чтобы остаться там. Я говорю об этом, потому что моя предыдущая попытка этого скрипта была в bash, и мне пришлось cut от команды time на самом деле, что также означало необходимость игнорировать вывод команды.

Я также должен добавить что-то вроде param,0.345 в файл csv.

Как выполнить команду из строки, а также время?

+0

'Баш -c "время test_command">/TMP/файл_журнала 2> & 1 '& затем' голова -п -4/TMP/stdout- err' 'tail -n 4/tmp/timing-data'. – anishsane

+0

@anishane: Похож на предложение избытка. Плюс использование временных файлов, когда это необязательно, может привести к неожиданному поведению (просто подумайте о запуске нескольких раз вашей команды с помощью «test_command») – JFred

ответ

2

Вы можете использовать subprocess запустить команду Линукс из строки и 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 сюда более подробную информацию о доступных параметрах

Предупреждение: к напечатайте stdout, вы также можете использовать Popen.stdout.read, но используйте communicate(), а не deadlocks из-за того, что любой из других буферов операционной системы заполняет и блокирует дочерний процесс.

+0

Спасибо большое чувак! –

1

Простейший способ, который остается в оболочке, использует опцию форматирования -f команды time. Вы можете использовать его так:

$ 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" 

Веселитесь

+0

Команда 'time', о которой вы говорите, является той, которая обычно находится в'/usr/bin/time', которая отсутствует в моей рабочей среде ... Это была одна из моих проблем с написанием оригинальных сценариев bash. «Время» у меня есть встроенное время в unix. –

+0

Да, это так. Я соответствующим образом изменил свой ответ. Если '/ usr/bin/time' недоступно для вас ... вы можете пойти на Python :).Я отвечаю, потому что это может быть интересно для людей, у которых есть '/ usr/bin/time'. – JFred

+0

Действительно. Спасибо за ответ в любом случае, надеюсь, что ваше редактирование поможет кому-то :) –