Вывод в реальном времени 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',