Це альтернативна відповідь у випадку, коли 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 обробляються асинхронно та окремо у вигляді нових рядків.
Якщо сказати, Юпітер отримує на stderr перший рядок, а потім "оброблений" вихід на stdout. Тоді як тільки він отримає вихід на stderr для оновлення прогресу, він не повернеться та не оновлює перший рядок, оскільки оновить лише останній рядок. Натомість йому доведеться написати новий рядок.
Обхід 1, написання до stdout
Одним із варіантів вирішення проблеми буде виведення обох на stdout:
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]
Тут ми можемо побачити, що Юпітер, здається, не очищається до кінця рядка. Для цього ми могли б додати ще одне вирішення, додавши пробіли. Як от:
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
, і це не впливає на панель прогресу.