tqdm di Jupyter Notebook mencetak bilah kemajuan baru berulang kali

138

Saya menggunakan tqdmuntuk mencetak kemajuan dalam skrip yang saya jalankan di notebook Jupyter. Saya mencetak semua pesan ke konsol via tqdm.write(). Namun, ini masih memberi saya keluaran miring seperti:

masukkan deskripsi gambar di sini

Yaitu, setiap kali baris baru harus dicetak, baris kemajuan baru dicetak pada baris berikutnya. Ini tidak terjadi ketika saya menjalankan skrip melalui terminal. Bagaimana saya bisa memecahkan masalah ini?

Rohan Saxena
sumber
Sebenarnya, ketika saya menggunakan tqdm_notebook, saya bahkan dapat melakukan prints normal , dan itu tidak mempengaruhi progress bar.
Tomasz Gandor
alternatifnya adalah dengan menggunakan progressbar stackoverflow.com/questions/3160699/python-progress-bar/…
eusoubrasileiro

Jawaban:

216

Coba gunakan tqdm.notebook.tqdmalih-alih tqdm, seperti dijelaskan di sini .

Ini bisa sesederhana mengubah impor Anda ke:

from tqdm.notebook import tqdm

Semoga berhasil!

EDIT: Setelah pengujian, tampaknya tqdmbenar - benar berfungsi dengan baik di 'mode teks' di notebook Jupyter. Sulit dikatakan karena Anda belum memberikan contoh minimal , tetapi sepertinya masalah Anda disebabkan oleh pernyataan cetak di setiap iterasi. Pernyataan cetak mengeluarkan angka (~ 0,89) di antara setiap pembaruan bilah status, yang mengacaukan output. Coba hapus pernyataan cetak.

oscarbranson
sumber
2
Saya belum menggunakan print()pernyataan, saya menggunakan tqdm.write(). Namun, tqdm_notebookmemberikan hasil yang bagus. Terima kasih
:)
Apakah Anda tahu jika itu mendukung Python 3.6? Saya tidak beruntung dengan ini
Jon
1
Kesalahan apa yang Anda dapatkan? Ini bekerja dengan baik untuk saya. Mustahil untuk membantu dengan begitu sedikit info ... Sudahkah Anda mengaktifkan ipywidgets di jupyer ? Apakah Anda hanya polos tqdm, bukan tqdm_notebook? Ini berfungsi baik dengan Python 3.6 dan Jupyter 1.0.0.
oscarbranson
tqdm_notebook dari tqdm 4.19.4 bekerja untuk saya di Python 3.6, Jupyter notebook 5.0.0, dan ipywidgets 7.0.3.
Matt Kleinsmith
2
@ bugmenot123 tangkapan bagus, diperbaiki.
Czyzby
39

Ini adalah jawaban alternatif untuk kasus di mana tqdm_notebook tidak berfungsi untuk Anda.

Diberikan contoh berikut:

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)

Outputnya akan terlihat seperti ini (progres akan terlihat merah):

  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

Masalahnya adalah bahwa output ke stdout dan stderr diproses secara tidak sinkron dan terpisah dalam hal baris baru.

Jika dikatakan Jupyter menerima pada stderr baris pertama dan kemudian "diproses" output pada stdout. Kemudian setelah menerima output pada stderr untuk memperbarui progres, ia tidak akan kembali dan memperbarui baris pertama karena hanya akan memperbarui baris terakhir. Sebaliknya harus menulis baris baru.

Solusi 1, menulis ke stdout

Satu solusi adalah dengan mengeluarkan keduanya ke stdout sebagai gantinya:

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)

Output akan berubah menjadi (tidak ada lagi merah):

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]

Di sini kita dapat melihat bahwa Jupyter tampaknya tidak jelas sampai akhir baris. Kita bisa menambahkan solusi lain dengan menambahkan spasi. Seperti:

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)

Yang memberi kita:

processed: 1                                                  
processed: 2                                                  
processed: 3                                                  
100%|██████████| 3/3 [00:02<00:00,  1.53it/s]

Solusi 2, tetapkan deskripsi

Mungkin secara umum lebih mudah untuk tidak memiliki dua output tetapi perbarui deskripsi, misalnya:

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)

Dengan output (deskripsi diperbarui saat sedang diproses):

processed: 3: 100%|██████████| 3/3 [00:02<00:00,  1.53it/s]

Kesimpulan

Anda sebagian besar dapat membuatnya berfungsi dengan baik dengan tqdm polos. Tetapi jika tqdm_notebook berfungsi untuk Anda, cukup gunakan itu (tetapi Anda mungkin tidak akan membaca sejauh itu).

de1
sumber
alternatifnya adalah dengan menggunakan progressbar stackoverflow.com/a/34482761/1207193
eusoubrasileiro
Ini adalah jawaban terbaik sejauh ini.
Rafay
18

Sebagian besar jawabannya sudah ketinggalan zaman sekarang. Lebih baik jika Anda mengimpor tqdm dengan benar.

from tqdm import tqdm_notebook as tqdm

masukkan deskripsi gambar di sini

Shritam Kumar Mund
sumber
7
Itu berubah lagi:TqdmDeprecationWarning: This function will be removed in tqdm==5.0.0 Please use tqdm.notebook.tqdm instead of tqdm.tqdm_notebook
stason
10

Jika kiat-kiat lain di sini tidak berfungsi dan - sama seperti saya - Anda menggunakan pandasintegrasi progress_apply, Anda dapat membiarkannya tqdm:

from tqdm.autonotebook import tqdm
tqdm.pandas()

df.progress_apply(row_function, axis=1)

Poin utama di sini terletak pada tqdm.autonotebookmodul. Sebagaimana dinyatakan dalam instruksi mereka untuk digunakan dalam Notebook IPython , ini membuat tqdmmemilih antara format progress bar yang digunakan dalam notebook Jupyter dan konsol Jupyter - karena suatu alasan masih kurang investigasi lebih lanjut di pihak saya, format khusus yang dipilih oleh tqdm.autonotebookbekerja dengan lancar pandas, sementara yang lain tidak progress_applykhusus untuk itu .

Julio Cezar Silva
sumber
9

Untuk menyelesaikan jawaban oscarbranson: dimungkinkan untuk secara otomatis memilih versi progress bar konsol atau notebook tergantung dari mana ia dijalankan:

from tqdm.autonotebook import tqdm

Info lebih lanjut dapat ditemukan di sini

mjarosie
sumber
8

Tidak satu pun di atas berfungsi untuk saya. Saya menemukan bahwa menjalankan mengikuti masalah ini setelah kesalahan (Ini hanya menghapus semua contoh bilah progres di latar belakang):

from tqdm import tqdm

# blah blah your code errored

tqdm._instances.clear()
James Owers
sumber
1
Terima kasih! Namun itu melempar dan kesalahan jika tidak ada instance. Masih ingin menggunakannya dengan skrip dan Hydrogen IDE. Ini kode saya. try: # Avoids problem on notebooks / Hydrogen IDE tqdm.tqdm._instances.clear() except Exception: pass
Jacques Peeters
Ya itu akan memunculkan eksepsi jika tidak ada instance. Apakah ada masalah dengan coba Anda kecuali pendekatan?
James Owers
0

Untuk semua orang yang ada di windows dan tidak bisa menyelesaikan masalah bilah duplikat dengan salah satu solusi yang disebutkan di sini. Saya harus menginstal coloramapaket sebagaimana dinyatakan dalam masalah tqdm yang diketahui yang memperbaikinya.

pip install colorama

Cobalah dengan contoh ini:

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)

Yang akan menghasilkan sesuatu seperti:

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

Gunakan tqdm_notebook

from tqdm import 
tqdm_notebook as tqdm

x=[1,2,3,4,5]

for i in tqdm(len(x)):

    print(x[i])
Kranthi Kumar Valaboju
sumber