Оператор Python print ничего не печатает с возвращением каретки
Я пытаюсь написать простой инструмент, который читает файлы с диска, выполняет некоторую обработку изображения, и возвращает результат работы алгоритма. Поскольку программа иногда может занять некоторое время, мне нравится иметь индикатор выполнения, поэтому я знаю, где он находится в программе. И поскольку я не люблю загромождать свою командную строку, и я на платформе Unix, я хотел использовать символ "r " для печати индикатора выполнения только на одной строке.
но когда у меня есть этот код здесь, он печатает ничего.
# Files is a list with the filenames
for i, f in enumerate(files):
print 'r%d / %d' % (i, len(files)),
# Code that takes a long time
Я тоже пробовал:
print 'r', i, '/', len(files),
Теперь, чтобы убедиться, что это работает в python, я попробовал это:
heartbeat = 1
while True:
print 'rHello, world', heartbeat,
heartbeat += 1
этот код прекрасно работает. Что происходит? Мое понимание возврата каретки в Linux заключалось в том, что он просто перемещает символ подачи строки в начало, а затем я могу перезаписать старый текст, который был написан ранее, если я не печатаю новую строку нигде. Кажется, этого не происходит. хотя.
кроме того, есть ли лучший способ отобразить индикатор выполнения в командной строке, чем то, что я пытаюсь сделать?
3 ответов
попробуйте добавить sys.stdout.flush()
после инструкции печати. Возможно, что print
не сбрасывает вывод, пока не напишет новую строку, чего здесь не происходит.
обработка возвратов каретки в Linux сильно отличается между терминальными эмуляторами.
обычно можно использовать escape-коды терминала, которые говорят эмулятору терминала перемещать виртуальную "каретку" по экрану (например, полноэкранные программы, работающие над строками BBS). Те, о которых я знаю, - это escape-коды VT100:
\e[A
: up\e[B
: вниз\e[C
: да\e[D
: левый\e[1~
: главная\e[4~
: конец
здесь \e
- это Escape-символ, \x1b
.
попробуйте заменить все \r
С \e[1~
см. Также этот пост
Если ваш терминал буферизован линией, вам может понадобиться sys.stdout.flush()
чтобы увидеть вашу печать, если вы не выдаете ленту.