2013-02-15 10 views
6

मैंने पाइथन के भीतर प्रगति पट्टी के लिए अलग-अलग समाधान देखे हैं, लेकिन सरल स्टडआउट समाधान मेरी परियोजना के लिए काम नहीं कर रहे हैं। मेरे पास कई कक्षाएं हैं और STDOUT को आउटपुट जानकारी के लिए "लॉगिंग" मॉड्यूल का उपयोग करें। मेरे पास एक ऐसा कार्य है जिसमें मैं एक पंक्ति पर प्रगति पट्टी दिखाना चाहता हूं, हर बार बफर को फ्लश करना चाहता हूं। सरल प्रगति कीलॉगिंग मॉड्यूल के माध्यम से पाइथन प्रोग्रेस बार

उदाहरण:

for i in range(100): 
    time.sleep(1) 
    sys.stdout.write("\r%d%%" %i) 
    sys.stdout.flush() 

जब मैं STDOUT के माध्यम से लिखना और फिर बफर फ्लश करने के लिए प्रयास करते हैं, या तो बफर प्लावित नहीं है या प्रगति कहीं भी जाने नहीं देता है। मैं इसे संभव बनाने के लिए किसी प्रकार की थ्रेडिंग या जटिल प्रक्रिया से बचने की उम्मीद कर रहा हूं। क्या ऐसा करने का कोई पसंदीदा तरीका है?

उत्तर

0

यदि आप जानते हैं प्रगति पट्टी हमेशा STDOUT को लिखी जा रही है, तो आपको केवल लॉगर के बजाय print का उपयोग करना चाहिए। दस्तावेज़ देखें in the Python logging tutorial documentation

+0

"प्रिंट" का उपयोग करने में समस्या यह है कि यह प्रत्येक मान को एक नई लाइन पर फेंकता है जो आउटपुट को प्रगति पट्टी नहीं बना रहा है। एसटीडीओटीटी को बफर को फ्लश करना और मौजूदा लाइन पर लिखना है, लेकिन लॉगिंग करने वाले कोड में इसका उपयोग करते समय यह काम नहीं करता है। आपको याद है, मैं प्रगति बार कोड के चारों ओर किसी भी लॉगिंग मॉड्यूल वाक्यविन्यास लपेट नहीं रहा हूँ। –

+1

ऊपर पोस्ट किए गए सटीक कोड का उपयोग करके, मुझे लगता है कि आउटपुट को जगह में बदल दिया जा रहा है। क्या आप प्रत्येक नंबर को एक नई लाइन पर देख रहे हैं? – jknupp

1

आप उपयोग कर सकते हैं tqdm progress bara custom handler through logging as described here साथ:

import logging 
import time 
import colorlog 
from tqdm import tqdm 

class TqdmHandler(logging.StreamHandler): 
    def __init__(self): 
     logging.StreamHandler.__init__(self) 

    def emit(self, record): 
     msg = self.format(record) 
     tqdm.write(msg) 

if __name__ == "__main__": 
    for x in tqdm(range(100)): 
     logger = colorlog.getLogger("MYAPP") 
     logger.setLevel(logging.DEBUG) 
     handler = TqdmHandler() 
     handler.setFormatter(colorlog.ColoredFormatter(
      '%(log_color)s%(name)s | %(asctime)s | %(levelname)s | %(message)s', 
      datefmt='%Y-%d-%d %H:%M:%S', 
      log_colors={ 
       'DEBUG': 'cyan', 
       'INFO': 'white', 
       'SUCCESS:': 'green', 
       'WARNING': 'yellow', 
       'ERROR': 'red', 
       'CRITICAL': 'red,bg_white'},)) 

     logger.addHandler(handler) 
     logger.debug("Inside subtask: "+str(x)) 
     time.sleep(.5) 
+0

यह मेरे लिए काम नहीं करता है। मुझे लगता है, आप इसे आजमा सकते हैं: https://gist.github.com/w495/80f6a7351a10d5b6cecb5dad6c8cd8d6 –

3

मैं इसे इस तरह हल:

import logging 
import time 
from tqdm import tqdm 
import io 

class TqdmToLogger(io.StringIO): 
    """ 
     Output stream for TQDM which will output to logger module instead of 
     the StdOut. 
    """ 
    logger = None 
    level = None 
    buf = '' 
    def __init__(self,logger,level=None): 
     super(TqdmToLogger, self).__init__() 
     self.logger = logger 
     self.level = level or logging.INFO 
    def write(self,buf): 
     self.buf = buf.strip('\r\n\t ') 
    def flush(self): 
     self.logger.log(self.level, self.buf) 

if __name__ == "__main__": 
    logging.basicConfig(format='%(asctime)s [%(levelname)-8s] %(message)s') 
    logger = logging.getLogger() 
    logger.setLevel(logging.DEBUG) 

    tqdm_out = TqdmToLogger(logger,level=logging.INFO) 
    for x in tqdm(range(100),file=tqdm_out,mininterval=30,): 
     time.sleep(.5) 

आउटपुट

2016-12-19 15:35:06 [INFO ] 16%|#####9        | 768/4928 [07:04<40:50, 1.70it/s] 
2016-12-19 15:36:07 [INFO ] 18%|######6        | 865/4928 [08:04<40:34, 1.67it/s] 
+0

बस उत्सुक है कि प्रगति पट्टी के अंत में संख्या ##### 9' से आती है, और कैसे हो सकती है हम इससे छुटकारा पा रहे हैं? – Sam

+0

मुझे लगता है कि यह 16.9% और 18.6% (दशमलव बिंदु) है। – ddofborg

2

मैं एक नहीं मिल सका इसके लिए अच्छा समाधान, इसलिए मैंनेलिखा इसे संभालने के लिए। असल में यह टर्मिनल के स्क्रॉल क्षेत्र को बदलता है, इसलिए जब भी आप STDOUT को लिखना चाहते हैं, प्रगति पट्टी को फिर से निकालने के बजाय प्रगति पट्टी (ओं) के ऊपर लॉगिंग किया जाता है। यह आपको टर्मिनल को logging, print, आदि

को संशोधित किए बिना जितना चाहें उतना टर्मिनल पर लिखने देता है। इसे अधिकांश गैर-विंडोज टर्मिनल पर काम करना चाहिए। विंडोज़ समर्थन भविष्य में आ सकता है, लेकिन किसी ने अभी तक इसके लिए नहीं पूछा है।

import logging 
import time 
import enlighten 

# Setup logging 
logging.basicConfig(level=logging.INFO) 
logger = logging.getLogger() 

# Setup progress bar 
manager = enlighten.get_manager() 
pbar = manager.counter(total=100, desc='Ticks', unit='ticks') 

for i in range(1, 101): 
    logger.info("Processing step %s" % i) 
    time.sleep(.2) 
    pbar.update() 
+0

मैंने अभी इस मॉड्यूल की खोज की, बिल्कुल मुझे क्या चाहिए! इसके लिए शुक्रिया। –

संबंधित मुद्दे