Заявление Python Print печатает ничего с возвратом каретки

StackOverflow https://stackoverflow.com/questions/2821503

Вопрос

Я пытаюсь написать простой инструмент, который читает файлы с диска, имеет некоторую обработку изображений и возвращает результат алгоритма. Поскольку программа иногда может возникнуть некоторое время, мне нравится иметь бар прогресс, поэтому я знаю, где он находится в программе. И поскольку я не люблю загрошить мою командную строку, и я на платформе 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 было то, что она просто переместила бы символ подачи линии в начало, а затем я мог перезаписать старый текст, который был написан ранее, если я никуда не распечатываю новую линию. Это, кажется, не происходит, хотя.

Кроме того, есть ли лучший способ отобразить панель прогресса в командной строке, чем то, что я токую, пытаясь сделать?

Это было полезно?

Решение

Попробуйте добавить sys.stdout.flush() после оператора печати. Возможно, что print Не промывает выходной сигнал до тех пор, пока он не записывает новую строку, которая здесь не происходит.

Другие советы

Обработка возврата каретки в Linux сильно отличается между эмуляторами терминала.

Обычно можно использовать коды Escape Terminal, которые позволят эмулятору терминала перемещать виртуальную «карету» вокруг экрана (подумайте о полноэкранных программах, работающих над линиями BBS). Те, о которых я знаю, являются кодами Escape VT100:

\e[A: вверх
\e[B: вниз
\e[C: правильно
\e[D: осталось
\e[1~: дома
\e[4~: конец

Где \e Является ли бегающий персонаж, \x1b.

Попробуйте заменить все \rс \e[1~

Также см эта почта

Если ваш терминал находится в строке, вам может понадобиться sys.stdout.flush() Чтобы увидеть вашу печать, если вы не выпустите линейный предел.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top