Я намагаюся написати скрипт для обгортки для програми командного рядка (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*
)?
sydout=PIPE
так, щоб підпроцес записувався безпосередньо на вашу консоль, минаючи батьківський процес?