Подпроцесс check_output сокращает мой вывод - PullRequest
3 голосов
/ 09 марта 2019

Мне нужно написать время, необходимое для запуска нескольких программ на C для нескольких файлов, используя:

time ./program filename

в электронную таблицу, и я использую subprocess.check_output, чтобы получить stdout в виде строки,Я должен получить что-то вроде:

real    0m0.001s
user    0m0.001s
sys     0m0.000s

, но я получаю:

b'0.00user 0.00system 0:00.00elapsed ?%CPU (0avgtext+0avgdata 
1388maxresident)k\n0inputs+0outputs (0major+60minor)pagefaults 
0swaps\n'

Я вижу пользовательское и системное время, но они обрезаются после двух десятичных знаков.Есть ли способ убедиться, что вывод читает все 3 десятичных знака?Вот мой код:

import xlwt
import subprocess

files = ('100KB.txt', '1MB.txt', '10MB.txt', '100MB.txt')
programs = ('./10kBuffer', './step2', './step3', './step4')

command = ['time', programs[0], files[0]]
out = subprocess.check_output(command, stderr=subprocess.STDOUT)
print(out)

Ответы [ 2 ]

2 голосов
/ 09 марта 2019

Похоже, что вы столкнулись с путаницей между GNU time, используемым вашим скриптом python, и встроенной оболочкой time, используемой в командной строке.

Это происходит из man-страницы дляGNU time:

Примечание: некоторые оболочки (например, bash (1)) имеют встроенную команду времени, которая обеспечивает меньшую функциональность, чем команда, описанная здесь.Чтобы получить доступ к настоящей команде, вам может потребоваться указать ее путь (например, /usr/bin/time).

Исходя из ожидаемого результата, похоже, что вы хотите, чтобы bash был собран-in, который дает 3 десятичных знака:

$ bash -c time time

real    0m0.000s
user    0m0.000s
sys     0m0.000s

$ sh -c time time
user    0m0.00s
sys     0m0.00s

$ ksh -c time time
user    0m0.00s
sys     0m0.00s

$ tcsh -c time time
0.016u 0.011s 0:00.02 100.0%    0+0k 0+0io 0pf+0w

Таким образом, чтобы указать встроенный bash вместо GNU time, вы можете изменить свою команду на:

command = ['bash', '-c', 'time', programs[0], files[0]]

и вы должны получить ожидаемый результат.

2 голосов
/ 09 марта 2019

потому что GNU time использует строку формата по умолчанию, более подробно, но вам нужна опция -p.

Цитирование руководства :

Строка формата по умолчанию:

% Uuser% Ssystem% Eelapsed% PCPU (% Xtext +% Ddata% Mmax) k% Iinputs +% OUTputs (% Fmajor +% Rminor) pagefaults% Wswaps

Когдауказана опция -p, используется (портативный) формат вывода:

real %e
user %U
sys %S

Вам также необходимо декодировать вывод, или вы получите bytes вместо str, ипереводы строки не будут интерпретироваться.Например:

>>> print(b'hello\nworld\n')
b'hello\nworld\n'
>>> print('hello\nworld\n')
hello
world

Поэтому я бы исправил ваш код следующим образом:

command = ['time', '-p', programs[0], files[0]]
out = subprocess.check_output(command, stderr=subprocess.STDOUT)
print(out.decode())

РЕДАКТИРОВАТЬ: другой ответ , кажется, помогает исправить недостающие десятичные дроби с помощью оболочкивстроенный.Вы можете смешать оба ответа, чтобы получить нужный вывод в виде строки с достаточным количеством десятичных дробей.

Обратите внимание, что кажется, что вы не можете добиться большего, если только вы не хотите использовать профилировщик для своей команды (см. Как мне узнать время выполнения программы на Python? )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...