Jupyter Notebookのtqdmが新しいプログレスバーを繰り返し印刷する


138

tqdmJupyterノートブックで実行しているスクリプトの進行状況を出力するために使用しています。すべてのメッセージをを介してコンソールに出力していtqdm.write()ます。ただし、これでもまだ次のような歪んだ出力が得られます。

ここに画像の説明を入力してください

つまり、新しい行を印刷する必要があるたびに、新しい進行状況バーが次の行に印刷されます。端末を介してスクリプトを実行する場合、これは起こりません。どうすればこれを解決できますか?


実際、を使用するとtqdm_notebook、通常printのを実行することもでき、進行状況バーには影響しません。
Tomasz Gandor

回答:


216

ここで説明されているtqdm.notebook.tqdmようにtqdm、の代わりにを使用してみてください。

これは、インポートを次のように変更するのと同じくらい簡単です。

from tqdm.notebook import tqdm

幸運を!

編集:テスト後tqdm、Jupyterノートブックの「テキストモード」で実際に正常に動作するようです。最小限の例を提供していないのでわかりにくいですが、問題は各反復の印刷ステートメントが原因であるようです。printステートメントは、各ステータスバーの更新の間に数字(〜0.89)を出力しており、出力がめちゃくちゃになっています。印刷ステートメントを削除してみてください。


2
私はprint()ステートメントを使用していませんtqdm.write()。使用しました。ただし、tqdm_notebook良い結果が得られます。ありがとう
:)

Python 3.6をサポートしているかどうか知っていますか?私はこれで運がありませんでした
Jon

1
どのようなエラーが発生していますか?それは私にとってはうまくいきます。情報が少ないためサポートできません... jupyerでipywidgets有効にしましたか?あなたはただ平凡tqdmではありtqdm_notebookませんか?これはPython 3.6とJupyter 1.0.0でうまく機能します。
oscarbranson 2017年

tqdm 4.19.4のtqdm_notebookは、Python 3.6、Jupyter Notebook 5.0.0、およびipywidgets 7.0.3で動作します。
Matt Kleinsmith、2017年

2
@ bugmenot123良いキャッチ、修正。
Czyzby

39

これは、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

問題は、stdoutstderrへの出力が、新しい行に関して非同期で個別に処理されることです。

たとえば、Jupyterがstderrで最初の行を受信し、次に「処理された」出力をstdoutで受信したとします。次に、stderrで出力を受け取って進行状況を更新すると、最後の行しか更新されないため、最初の行に戻って更新することはありません。代わりに、新しい行を記述する必要があります。

回避策1、stdoutへの書き込み

回避策の1つは、代わりに両方を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]

ここでは、Jupyterが行の終わりまでクリアされないように見えることがわかります。スペースを追加することで、別の回避策を追加できます。といった:

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、代わりに説明を設定

一般に、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が機能する場合は、それを使用してください(ただし、おそらくそれまではここを読みません)。


別の方法は、このprogressbar stackoverflow.com/a/34482761/1207193
eusoubrasileiro

これは断然最良の答えです。
Rafay

18

答えのほとんどは現在古くなっています。tqdmを正しくインポートした方がよいでしょう。

from tqdm import tqdm_notebook as tqdm

ここに画像の説明を入力してください


7
再び変更されました:TqdmDeprecationWarning: This function will be removed in tqdm==5.0.0 Please use tqdm.notebook.tqdm instead of tqdm.tqdm_notebook
スターソン

10

ここでの他のヒントが機能せず、私と同じようにpandasを介して統合を使用しているprogress_apply場合は、tqdmそれを処理させることができます。

from tqdm.autonotebook import tqdm
tqdm.pandas()

df.progress_apply(row_function, axis=1)

ここでの要点はtqdm.autonotebookモジュールにあります。IPython Notebooks使用するための指示で述べたように、これによりtqdm、Jupyter NotebookとJupyterコンソールで使用されるプログレスバーの形式が選択されます-理由がまだ私の側で詳細な調査が欠けているため、で選択された特定の形式tqdm.autonotebookpandasでスムーズに機能しますが、他のすべての形式はそうではありませんprogress_apply特に、


9

oscarbransonの回答を完了するには:実行元に応じて、コンソールまたはノートブックバージョンのプログレスバーを自動的に選択することができます。

from tqdm.autonotebook import tqdm

詳細はこちら


8

上記のどれも私にはうまくいきません。エラーの後、次のように実行するとこの問題がソートされることがわかります(バックグラウンドの進行状況バーのすべてのインスタンスがクリアされるだけです)。

from tqdm import tqdm

# blah blah your code errored

tqdm._instances.clear()

1
ありがとうございました!ただし、インスタンスが存在しない場合はスローしてエラーになります。それでも、スクリプトとHydrogen IDEで使用したい。これが私のコードです。 try: # Avoids problem on notebooks / Hydrogen IDE tqdm.tqdm._instances.clear() except Exception: pass
ジャックピーターズ

はい、インスタンスが存在しない場合は例外をスローします。アプローチ以外の試みに問題はありますか?
James Owers

0

Windowsを使用していて、ここで説明されている解決策のいずれかで複製バーの問題を解決できなかったすべての人向け。coloramaパッケージを修正したtqdmの既知の問題に記載されているように、パッケージをインストールする必要がありました。

pip install colorama

次の例で試してください。

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)

これは次のようなものを生成します:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.