Оператор 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() чтобы увидеть вашу печать, если вы не выдаете ленту.