Это альтернативный ответ на случай, когда tqdm_notebook у вас не работает.
Учитывая следующий пример:
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values)) as pbar:
for i in values:
pbar.write('processed: %d' %i)
pbar.update(1)
sleep(1)
Вывод будет выглядеть примерно так (прогресс будет отображаться красным):
0%| | 0/3 [00:00<?, ?it/s]
processed: 1
67%|██████▋ | 2/3 [00:01<00:00, 1.99it/s]
processed: 2
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
processed: 3
Проблема в том, что вывод на stdout и stderr обрабатывается асинхронно и отдельно с точки зрения новых строк.
Если, скажем, Jupyter получает на stderr первую строку, а затем «обработанный» вывод на stdout. Затем, как только он получит вывод на stderr для обновления хода выполнения, он не вернется назад и не обновит первую строку, поскольку обновит только последнюю строку. Вместо этого ему придется написать новую строку.
Обходной путь 1, запись в стандартный вывод
Одним из способов решения этой проблемы будет вывод обоих на стандартный вывод:
import sys
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
for i in values:
pbar.write('processed: %d' % (1 + i))
pbar.update(1)
sleep(1)
Выход изменится на (не более красный):
processed: 1 | 0/3 [00:00<?, ?it/s]
processed: 2 | 0/3 [00:00<?, ?it/s]
processed: 3 | 2/3 [00:01<00:00, 1.99it/s]
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Здесь мы видим, что Jupyter, кажется, не очищается до конца строки. Мы могли бы добавить другой обходной путь для этого, добавив пробелы. Такие как:
import sys
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
for i in values:
pbar.write('processed: %d%s' % (1 + i, ' ' * 50))
pbar.update(1)
sleep(1)
Что дает нам:
processed: 1
processed: 2
processed: 3
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Обходной путь 2, установите описание вместо
В целом, может быть более простым не иметь два выхода, а вместо этого обновить описание, например:
import sys
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
for i in values:
pbar.set_description('processed: %d' % (1 + i))
pbar.update(1)
sleep(1)
На выходе (описание обновляется в процессе обработки):
processed: 3: 100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Вывод
В основном вы можете заставить его нормально работать с простым tqdm. Но если tqdm_notebook работает для вас, просто используйте его (но тогда вы, вероятно, не прочитали бы это далеко).
tqdm_notebook
, я могу даже делать обычныеprint
с, и это не влияет на индикатор выполнения.