Вывод в реальном времени subprocess.popen(), а не построчно

В настоящее время я переписываю небольшую программу-оболочку на python, которую я когда-то писал на C++. Он извлекает файлы из файла и помещает их в другой формат.

В C++ выходные данные системных команд, которые мне нужно было выполнить, были "в реальном времени", то есть строка состояния и процентный показатель некоторых команд, отображаемых в реальном времени. С python я получаю каждый "процент" на экране по отдельности (потому что я читаю его построчно). Вот пример: Вот как выглядит строка состояния в версии Python (это продолжается до 100). В C++ он обновляется сам.

| (02/100)\rImporting AVC-H264: |                    | (03/100)\rImporting AVC-H264: |                       | (04/100)\rImporting AVC-H264: |=

Вот соответствующий код Python:

p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for line in iter(p.stdout.readline, ""):
   print line,

Любые идеи о том, как я мог бы сделать это выглядит в C++?

3 ответа

Решение

Может быть две вещи...

Вполне вероятно, что readline меняет некоторые вещи из вывода вашей программы. я верю \r is возврат каретки и указывает терминалу вернуться в начало строки, после чего программа может вывести поверх текста, который она только что вывела. Readline, скорее всего, удаляет это.

Первое, что нужно попробовать,

p = subprocess.Popen(args, stdout=subprocess.PIPE, \
                     stderr=subprocess.PIPE, \
                     universal_newlines=True)
for line in iter(p.stdout.readline, ""):
    sys.stdout.write('\r'+line[:-1])
    sys.stdout.flush()

Вы должны сделать сброс, потому что stdout буферизует, пока не получит \n и, конечно, вы не пишете один.

В Windows вы можете вывести символ возврата (код ASCII 8). Пример (печатает текущую итерацию, используя только однозначные числа):

>>> import time
>>> import sys
>>> for i in xrange(10):
...     sys.stdout.write(str(i))
...     time.sleep(.5)
...     sys.stdout.write(chr(8))
...

Вам нужно будет отслеживать количество символов в текущей строке... Я уверен, что должен быть лучший способ.

В Linux кажется, что вы можете написать возврат каретки для сброса позиции курсора. См. Стирание текущей напечатанной строки консоли и Вывод хода на месте в терминале или консоли.

Извините, но я не очень хорошо понимал часть реального времени, но, возможно, я могу помочь с частью "обнови сам", попробуйте это:

for line in iter(p.stdout.readline, ""):
   print line + '\r',
Другие вопросы по тегам