Jupyter नोटबुक में tqdm बार-बार नई प्रगति बार प्रिंट करता है


138

मैं tqdmएक स्क्रिप्ट में प्रगति को प्रिंट करने के लिए उपयोग कर रहा हूं जो मैं एक ज्यूपिटर नोटबुक में चल रहा हूं। मैं कंसोल के माध्यम से सभी संदेशों को मुद्रित कर रहा हूं tqdm.write()। हालाँकि, यह अभी भी मुझे एक तिरछा आउटपुट देता है जैसे:

यहाँ छवि विवरण दर्ज करें

यानी, हर बार एक नई लाइन छपनी होती है, अगली लाइन पर एक नई प्रगति पट्टी छपी होती है। जब मैं स्क्रिप्ट को टर्मिनल के माध्यम से चलाता हूं तो ऐसा नहीं होता है। इसे कैसे हल किया जा सकता है?


दरअसल, जब मैं उपयोग करता हूं, तो मैं tqdm_notebookसामान्य printएस भी कर सकता हूं , और यह प्रगति पट्टी को प्रभावित नहीं करता है।
टॉमस गैंडर

जवाबों:


216

यहाँ उल्लिखित के tqdm.notebook.tqdmबजाय उपयोग करने का प्रयास करेंtqdm

यह आपके आयात को बदलने के रूप में सरल हो सकता है:

from tqdm.notebook import tqdm

सौभाग्य!

EDIT: परीक्षण के बाद, ऐसा लगता है कि tqdmवास्तव में जुपिटर नोटबुक में 'टेक्स्ट मोड' में ठीक काम करता है। यह बताना मुश्किल है क्योंकि आपने एक न्यूनतम उदाहरण प्रदान नहीं किया है , लेकिन ऐसा लगता है कि आपकी समस्या प्रत्येक पुनरावृत्ति में एक प्रिंट स्टेटमेंट के कारण है। प्रत्येक स्टेटस बार अपडेट के बीच प्रिंट स्टेटमेंट एक नंबर (~ 0.89) को अलग कर रहा है, जो आउटपुट को गड़बड़ कर रहा है। प्रिंट स्टेटमेंट निकालने की कोशिश करें।


2
मैंने एक print()कथन का उपयोग नहीं किया है , मैंने उपयोग किया है tqdm.write()। हालांकि, tqdm_notebookअच्छे परिणाम देता है। धन्यवाद:)
रोहन सक्सेना

क्या आप जानते हैं कि यह पायथन 3.6 का समर्थन करता है? मैं इस के साथ किस्मत में नहीं था
जॉन

1
आप क्या त्रुटि प्राप्त कर रहे हैं? यह मेरे लिए ठीक काम करता है। इतनी कम जानकारी के साथ मदद करना असंभव है ... क्या आपने ipywidgets को jupyer में सक्षम किया है ? क्या आपने केवल सादा है tqdm, बजाय tqdm_notebook? यह Python 3.6 और Jupyter 1.0.0 के साथ अच्छी तरह से काम करता है।
ऑस्करब्रेनसन

4.19.4 से tqdm_notebook Python 3.6, Jupyter नोटबुक 5.0.0 और ipywidgets 7.0.3 पर मेरे लिए काम कर रहा है।
मैट क्लिंसमिथ

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

समस्या यह है कि stdout और stderr के आउटपुट को एसिंक्रोनस रूप से और अलग से नई लाइनों के रूप में संसाधित किया जाता है।

अगर कहते हैं कि ज्यूपिटर को पहली पंक्ति में और फिर स्टडआउट पर "संसाधित" आउटपुट प्राप्त होता है। फिर एक बार इसे प्रगति को अपडेट करने के लिए stderr पर एक आउटपुट प्राप्त होता है, यह वापस नहीं जाएगा और पहली पंक्ति को अपडेट करेगा क्योंकि यह केवल अंतिम पंक्ति को अपडेट करेगा। इसकी जगह नई लाइन लिखनी होगी।

वर्कअराउंड 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]

यहाँ हम देख सकते हैं कि बृहस्पति रेखा के अंत तक स्पष्ट नहीं लगता है। हम रिक्त स्थान जोड़कर इसके लिए एक और समाधान जोड़ सकते हैं। जैसे कि:

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, इसके बजाय विवरण सेट करें

यह सामान्य रूप से दो आउटपुट न होने के लिए अधिक सीधे आगे हो सकता है, लेकिन इसके बजाय विवरण को अपडेट करें, जैसे:

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]

निष्कर्ष

आप इसे ज्यादातर सादे tdm के साथ ठीक काम करने के लिए प्राप्त कर सकते हैं। लेकिन अगर tqdm_notebook आपके लिए काम करता है, तो बस उस का उपयोग करें (लेकिन तब आप शायद उस तक नहीं पढ़ पाएंगे)।


एक विकल्प इस progressbar stackoverflow.com/a/34482761/1207193
eusoubrasileiro

यह अब तक का सबसे अच्छा जवाब है।
रफय

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मॉड्यूल में है। जैसा कि आईपीथॉन नोटबुक में उपयोग के लिए उनके निर्देशों में कहा गया है , यह tqdmज्यूपिटर नोटबुक और ज्यूपिटर कंसोल में उपयोग किए जाने वाले प्रगति बार प्रारूपों के बीच चयन करता है - एक कारण है कि अभी भी मेरी तरफ से आगे की जांच का अभाव है, विशिष्ट प्रारूप tqdm.autonotebookसुचारू रूप से काम करता है pandas, जबकि अन्य सभी ने नहीं किया। 'टी, progress_applyविशेष रूप से के लिए।


9

ऑस्करब्रेनसन के उत्तर को पूरा करने के लिए: यह कहां से चलाया जा रहा है, इसके आधार पर प्रगति बार के कंसोल या नोटबुक संस्करणों को स्वचालित रूप से चुनना संभव है:

from tqdm.autonotebook import tqdm

अधिक जानकारी यहां पाई जा सकती है


8

उपरोक्त में से कोई भी मेरे लिए काम नहीं करता है। मुझे लगता है कि त्रुटि के बाद इस मुद्दे को हल करने के लिए चल रहा है (यह पृष्ठभूमि में प्रगति सलाखों के सभी उदाहरणों को साफ करता है):

from tqdm import tqdm

# blah blah your code errored

tqdm._instances.clear()

1
धन्यवाद! हालाँकि यह फेंकता है और त्रुटि होती है यदि कोई उदाहरण मौजूद नहीं है। फिर भी इसे स्क्रिप्ट और हाइड्रोजन आईडीई के साथ उपयोग करना चाहते हैं। यहाँ मेरा कोड है। try: # Avoids problem on notebooks / Hydrogen IDE tqdm.tqdm._instances.clear() except Exception: pass
जैक्स पीटर्स

यदि कोई उदाहरण मौजूद नहीं है, तो यह अपवाद छोड़ देगा। दृष्टिकोण के अलावा आपकी कोशिश के साथ कोई समस्या है?
जेम्स ओवर्स

1

हर कोई जो खिड़कियों पर है और यहां बताए गए किसी भी समाधान के साथ डुप्लिकेटिंग सलाखों के मुद्दे को हल नहीं कर सकता है। मुझे tqdm के ज्ञात मुद्दों केcolorama अनुसार पैकेज को स्थापित करना था जिसने इसे तय किया।

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]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.