Jupyter Notebook'daki tqdm yeni ilerleme çubuklarını tekrar tekrar yazdırıyor


138

tqdmBir Jupyter not defterinde çalıştırdığım bir komut dosyasında ilerleme yazdırmak için kullanıyorum . Tüm mesajları konsola üzerinden yazdırıyorum tqdm.write(). Ancak, bu hala bana böyle bir çıktı verir:

resim açıklamasını buraya girin

Yani, yeni bir satırın her yazdırılması gerektiğinde, sonraki satıra yeni bir ilerleme çubuğu yazdırılır. Komut dosyasını terminal üzerinden çalıştırdığımda bu gerçekleşmiyor. Bunu Nasıl Çözebilirim?


Aslında, kullandığımda tqdm_notebooknormal prints bile yapabilirim ve ilerleme çubuğunu etkilemez.
Tomasz Gandor

Yanıtlar:


216

Kullanmayı deneyin tqdm.notebook.tqdmyerine tqdmözetlendiği gibi, burada .

Bu, içe aktarma işleminizi şu şekilde değiştirmek kadar basit olabilir:

from tqdm.notebook import tqdm

İyi şanslar!

DÜZENLEME: Testten sonra, tqdmJupyter dizüstü bilgisayardaki 'metin modunda' iyi çalışıyor gibi görünüyor . Söylemek zor, çünkü minimal bir örnek vermediniz , ancak sorununuz her yinelemedeki bir yazdırma ifadesinden kaynaklanıyor gibi görünüyor. Print deyimi, her durum çubuğu güncellemesi arasında çıktıyı bozan bir sayı (~ 0.89) çıkarıyor. Print deyimini kaldırmayı deneyin.


2
Ben bir print()ifade kullanmadım, kullandım tqdm.write(). Ancak, tqdm_notebookiyi sonuçlar verir. Teşekkür:)
Rohan Saxena

Python 3.6'yı destekleyip desteklemediğini biliyor musunuz? Bununla şansım olmadı
Jon

1
Ne hatası alıyorsunuz? Benim için iyi çalışıyor. Bu kadar az bilgiye yardım etmek imkansız ... Jüpyerde ipywidget'ları etkinleştirdiniz mi? Sadece sade tqdmdeğil tqdm_notebookmisin? Bu Python 3.6 ve Jupyter 1.0.0 ile iyi çalışır.
oscarbranson

tqdm 4.19.4 sürümünden tqdm_notebook benim için Python 3.6, Jupyter notebook 5.0.0 ve ipywidgets 7.0.3 üzerinde çalışıyor.
Matt Kleinsmith

2
@ bugmenot123 İyi yakalama, düzeltildi.
Czyzby

39

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 ).


bir alternatif de bu progressbar stackoverflow.com/a/34482761/1207193
eusoubrasileiro

Bu en iyi cevap.
Rafay

18

Cevapların çoğu şimdi modası geçmiş. Eğer tqdm doğru içe aktarırsanız daha iyi olur .

from tqdm import tqdm_notebook as tqdm

resim açıklamasını buraya girin


7
Yine değişti:TqdmDeprecationWarning: This function will be removed in tqdm==5.0.0 Please use tqdm.notebook.tqdm instead of tqdm.tqdm_notebook
Mart'ta stason

10

Buradaki diğer ipuçları işe yaramazsa ve - tıpkı benim gibi - pandasentegrasyonu üzerinden kullanıyorsanız, progress_applybunu tqdmhalledebilirsiniz:

from tqdm.autonotebook import tqdm
tqdm.pandas()

df.progress_apply(row_function, axis=1)

Buradaki ana nokta tqdm.autonotebookmodülde yatmaktadır . IPython Dizüstü Bilgisayarlarda kullanım talimatlarında belirtildiği gibi , bu, tqdmJupyter dizüstü bilgisayarlarda ve Jupyter konsollarında kullanılan ilerleme çubuğu formatları arasında seçim yapar - bir yanımda hala daha fazla araştırma tqdm.autonotebookyapılmaması nedeniyle pandas, seçilen belirli format sorunsuz çalışır , diğerleri ise için, t' progress_apply, özellikle.


9

Oscarbranson'un cevabını tamamlamak için: Nereden çalıştırıldığına bağlı olarak ilerleme çubuğunun konsol veya dizüstü bilgisayar sürümlerini otomatik olarak seçmek mümkündür:

from tqdm.autonotebook import tqdm

Daha fazla bilgi burada bulunabilir


8

Yukarıdakilerin hiçbiri benim için çalışmıyor. Aşağıdaki çalıştıran hatadan sonra bu sorunu sıralar buluyorum (Sadece arka planda ilerleme çubuklarının tüm örneklerini temizler):

from tqdm import tqdm

# blah blah your code errored

tqdm._instances.clear()

1
Teşekkür ederim! Ancak, hiçbir örnek yoksa hata ve hata verir. Yine de komut dosyaları ve Hidrojen IDE ile kullanmak istiyorum. İşte kodum. try: # Avoids problem on notebooks / Hydrogen IDE tqdm.tqdm._instances.clear() except Exception: pass
Jacques Peeters

Evet, bir örnek yoksa bir istisna atar. Denemenizde yaklaşım dışında bir sorun var mı?
James Owers

1

Pencerelerde olan ve çoğaltılan çubuk sorununu burada çözemeyen çözümlerle çözemeyen herkes için. coloramaPaketi tqdm'nin düzelten bilinen sorunlarında belirtildiği gibi kurmak zorunda kaldım .

pip install colorama

Bu örnekle deneyin:

from tqdm import tqdm
from time import sleep

for _ in tqdm(range(5), "All", ncols = 80, position = 0):
    for _ in tqdm(range(100), "Sub", ncols = 80, position = 1, leave = False):
        sleep(0.01)

Hangi gibi bir şey üretecek:

All:  60%|████████████████████████                | 3/5 [00:03<00:02,  1.02s/it]
Sub:  50%|██████████████████▌                  | 50/100 [00:00<00:00, 97.88it/s]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.