Bu, tqdm_notebook'un sizin için çalışmadığı durumlar için alternatif bir cevaptır .
Aşağıdaki örnek verildiğinde:
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)
Çıktı şu şekilde görünecektir (ilerleme kırmızı görünecektir):
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
Sorun, stdout ve stderr çıktılarının yeni satırlar açısından eşzamansız ve ayrı ayrı işlenmesidir.
Eğer Jupyter stderr'a ilk satırı ve sonra stdout'ta "işlenmiş" çıktıyı alırsa. Daha sonra ilerlemeyi güncellemek için stderr'de bir çıktı aldığında, geri dönmez ve ilk satırı yalnızca son satırı güncelleyeceği için güncellemez. Bunun yerine yeni bir satır yazmak zorunda kalacak.
Geçici çözüm 1, stdout'a yazma
Bir çözüm, her ikisini de stdout'a çıkarmak olacaktır:
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)
Çıktı (artık kırmızı yok) olarak değişecektir:
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]
Burada Jupyter'in çizginin sonuna kadar net görünmediğini görebiliriz. Boşluk ekleyerek başka bir geçici çözüm ekleyebiliriz. Gibi:
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)
Hangi bize verir:
processed: 1
processed: 2
processed: 3
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Geçici çözüm 2, bunun yerine açıklamayı ayarlayın
Genelde iki çıkışa sahip olmamak daha açık olabilir, bunun yerine açıklamayı güncelleyin, örneğin:
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)
Çıktı ile (açıklama işlenirken güncellendi):
processed: 3: 100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Sonuç
Çoğunlukla düz tqdm ile iyi çalışmasını sağlayabilirsiniz. Ama eğer tqdm_notebook sizin için çalışıyorsa, sadece bunu kullanın (ama muhtemelen o kadar uzakta okumazsınız ).
tqdm_notebook
normalprint
s bile yapabilirim ve ilerleme çubuğunu etkilemez.