Оператор печати Python ничего не печатает с возвратом каретки

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

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

7
задан Jonathan Sternberg 12 May 2010 в 18:05
поделиться

3 ответа

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

10
ответ дан 6 December 2019 в 15:19
поделиться

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

2
ответ дан 6 December 2019 в 15:19
поделиться

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

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

\ e [A : up
\ e [B : down
] \ e [C : right
\ e [D : left
\ e [1 ~ : home
\ e [4 ~ : end

] Где \ e - escape-символ \ x1b .

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

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

2
ответ дан 6 December 2019 в 15:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: