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