Dies ist eine alternative Antwort für den Fall, dass tqdm_notebook für Sie nicht funktioniert.
Anhand des folgenden Beispiels:
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)
Die Ausgabe würde ungefähr so aussehen (Fortschritt würde rot angezeigt):
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
Das Problem ist, dass die Ausgabe an stdout und stderr asynchron und getrennt in Bezug auf neue Zeilen verarbeitet wird.
Wenn sagen, Jupyter empfängt auf stderr die erste Zeile und dann die "verarbeitete" Ausgabe auf stdout. Sobald es eine Ausgabe auf stderr erhält, um den Fortschritt zu aktualisieren, würde es nicht zurückgehen und die erste Zeile aktualisieren, da es nur die letzte Zeile aktualisieren würde. Stattdessen muss eine neue Zeile geschrieben werden.
Problemumgehung 1, Schreiben an stdout
Eine Problemumgehung wäre, stattdessen beide in stdout auszugeben:
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)
Die Ausgabe ändert sich zu (nicht mehr rot):
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]
Hier können wir sehen, dass Jupyter erst am Ende der Zeile zu klären scheint. Wir könnten eine weitere Problemumgehung hinzufügen, indem wir Leerzeichen hinzufügen. Sowie:
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)
Was uns gibt:
processed: 1
processed: 2
processed: 3
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Problemumgehung 2: Legen Sie stattdessen die Beschreibung fest
Im Allgemeinen ist es möglicherweise einfacher, nicht zwei Ausgänge zu haben, sondern stattdessen die Beschreibung zu aktualisieren, z.
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)
Mit der Ausgabe (Beschreibung während der Verarbeitung aktualisiert):
processed: 3: 100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Fazit
Sie können es meistens mit normalem tqdm zum Laufen bringen. Aber wenn tqdm_notebook für Sie funktioniert, verwenden Sie das einfach (aber dann würden Sie wahrscheinlich nicht so weit lesen).
tqdm_notebook
, kann ich sogar normaleprint
s machen, und es hat keinen Einfluss auf den Fortschrittsbalken.