Я пытаюсь написать скрипт-обертку для программы командной строки (проверка svnadmin), которая будет отображать хороший индикатор выполнения операции. Это требует, чтобы я мог видеть каждую строку вывода из обернутой программы, как только она выводится.
Я подумал, что я просто запустил бы программу, используя subprocess.Popen
, использовал stdout=PIPE
, затем прочитал каждую строку по мере ее поступления и действовал соответственно. Однако, когда я запустил следующий код, выходные данные оказались буферизированными где-то, в результате чего он появился в двух частях: строки с 1 по 332, затем с 333 по 439 (последняя строка вывода)
from subprocess import Popen, PIPE, STDOUT
p = Popen('svnadmin verify /var/svn/repos/config', stdout = PIPE,
stderr = STDOUT, shell = True)
for line in p.stdout:
print line.replace('\n', '')
Немного посмотрев документацию по подпроцессу, я обнаружил для параметра bufsize
значение Popen
, поэтому я попытался установить для параметра bufsize значение 1 (буферизовать каждую строку) и 0 (без буфера), но ни одно из значений не изменилось. способ доставки линий.
В этот момент я начал понимать соломинки, поэтому я написал следующий цикл вывода:
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
но получил тот же результат.
Можно ли получить вывод программы в реальном времени для программы, выполняемой с использованием подпроцесса? Есть ли какой-нибудь другой вариант в Python, который совместим с прямым (не exec*
)?