2017-01-30 12 views
3

У меня есть прогресс бар tqdm:Tqdm Строка состояния, отображаемая до казнена

print('foo') 
for status in tqdm(cursor.items(count)): 
    #process status 
    pass 

I напечатать несколько сообщений цикла, но прогресс бар показан перед ними. Есть ли какая-нибудь многопоточность или как я могу это исправить?

ответ

1

tqdm работает в потоке (это хорошо, поскольку приложение не застревает из-за индикатора выполнения), и поэтому перед печатью отображается индикатор выполнения.

Поскольку устройство видит, что печать представляет собой операцию ввода-вывода, поэтому машина отдает приоритет tqdm.

Вам нужно спать незадолго до и после цикла. Для этого используйте time.sleep(x) (x в секундах) до и после цикла, чтобы остановить проблему. Не забудьте указать import time в начале вашего кода. Эксперимент с разными значениями x, но только 0,1, вероятно, будет работать нормально.

+2

Вы также можете попробовать с аргументом ключевого слова 'flush' для печати, например,' print ("foo", flush = True) ' – Copperfield

+0

Это не работает на окнах, но это более элегантно, чем ждать – R3turnz

+0

Это не является причиной того, что распечатки заканчиваются в неправильном порядке, и спать в течение фиксированного времени может все же сбой в определенных ситуациях в зависимости от того, насколько быстро Python может обрабатывать различные команды, которые печатаются на терминале (хотя в этом [ MWE] (https://en.wikipedia.org/wiki/Minimal_Working_Example), вероятно, будет работать). См. Мой ответ для решения, в котором вам не нужно использовать 'time.sleep'. – HelloGoodbye

0

Проблема заключается в том, что print по умолчанию печатает до sys.stdout, а tqdm by default prints to sys.stderr, что делает их десинхронизированными.

Вы можете либо указать file=sys.stdout к tqdm или указать file=sys.sterr к print, чтобы и печатать на одном потоке, или вы можете вызвать sys.stdout.flush до и sys.stderr.flush после каждого вызова tqdm.

+0

Почему мой ответ был опущен? Это было неправильно? – HelloGoodbye

0

Я могу сообщить, как сообщалось, что несколько сообщений о решениях работали для меня в Windows 10. У меня также возникла проблема с выходом строки строки tqdm, прерванной печатью, выполненной до tqdm. Решение, которое работало для меня

sys.stdout.flush() 

Тот, который не был дополнением к отпечаткам

flush=True 

Я думаю, что sys.stdout.flush является лучшим, насколько это ТОЧНО что нужно сделать ... вывод на stdout нужно очистить, чтобы он был завершен до первого вывода на stderr с помощью tqdm ... самых основных проблем ввода-вывода.

Я ЛЮБЛЮ способность этого маленького виджета привнести немного элегантности в другой скучный мир stdio.

: