Я пытаюсь записать простой инструмент, который читает файлы из диска, делает некоторую обработку изображений и возвращает результат алгоритма. Так как программа может иногда брать некоторое время, мне нравится иметь индикатор выполнения, таким образом, я знаю, где это находится в программе. И так как мне не нравится загромождать мою командную строку, и я нахожусь на платформе 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
не сбрасывает вывод до тех пор, пока не будет записана новая строка, чего здесь не происходит.
Если ваш терминал имеет буферизацию строк, вам может понадобиться sys.stdout.flush()
, чтобы увидеть свою печать, если вы не используете перевод строки.
Обработка возврата каретки в 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 ~
Также см. этот пост