Я пытаюсь написать сценарий оболочки для программы командной строки (svnadmin verify), которая будет отображать хороший индикатор выполнения операции. Это требует, чтобы я мог видеть каждую строку вывода завернутой программы, как только она выводится.
Я решил, что просто выполню программу, используя 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
параметр to Popen
, поэтому я попытался установить bufsize на 1 (буферизовать каждую строку) и 0 (без буфера), но ни одно значение, похоже, не изменило способ доставки строк.
В этот момент я начал цепляться за соломинку, поэтому написал следующий цикл вывода:
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
но получил тот же результат.
Можно ли получить вывод программы в реальном времени программы, выполняемой с помощью подпроцесса? Есть ли в Python какой-либо другой вариант, который (не exec*
) совместим с продвижением вперед ?
sydout=PIPE
чтобы подпроцесс записывал прямо на вашу консоль, минуя родительский процесс?