2010-05-23 16 views
7

मैं अपनी स्क्रीन संदेशों colorizing के लिए निम्नलिखित कार्य किया है:STDOUT करने के लिए मुद्रण और लॉग फ़ाइल जबकि एएनएसआई रंग कोड को हटाने

def error(string): 
    return '\033[31;1m' + string + '\033[0m' 

def standout(string): 
    return '\033[34;1m' + string + '\033[0m' 

मैं उन्हें इस्तेमाल इस प्रकार है:

print error('There was a problem with the program') 
print "This is normal " + standout("and this stands out") 

मैं प्रवेश करना चाहते हैं एएनएसआई रंग कोड के बिना एक फ़ाइल (एसटीडीओयूटी के अलावा) को आउटपुट, उम्मीद है कि प्रत्येक print कथन में दूसरी "लॉगिंग" लाइन जोड़ने के बिना।

कारण यह है कि यदि आप बस python program.py > out हैं तो फ़ाइल out में एएनएसआई रंग कोड होंगे, जो एक सादा पाठ संपादक में खुलते हैं तो भयानक लगते हैं।

कोई सलाह?

उत्तर

9

sys.stdout.isatty समारोह मदद करने में सक्षम हो सकता है:

from sys import stdout 

def error(string, is_tty=stdout.isatty()): 
    return ('\033[31;1m' + string + '\033[0m') if is_tty else string 

def standout(string, is_tty=stdout.isatty()): 
    return ('\033[34;1m' + string + '\033[0m') if is_tty else string 

वास्तव में कुछ का उपयोग करता है मैं के बारे में सोच सकते हैं एक डिफ़ॉल्ट तर्क यह है कि None पर सेट नहीं है का उपयोग करने के में से एक है ऐसा इसलिए है क्योंकि डिफ़ॉल्ट तर्क संकलन पर मूल्यांकन किया जाता है सी ++ में रनटाइम की तरह पाइथन में समय ...

यदि आपको वास्तव में आवश्यकता होने पर व्यवहार को स्पष्ट रूप से ओवरराइड किया जा सकता है, हालांकि यह आपको रीडायरेक्ट होने पर स्वयं को स्टडआउट में हेरफेर करने की अनुमति नहीं देता है। क्या कोई कारण है कि आप logging मॉड्यूल का उपयोग नहीं कर रहे हैं (शायद आपको इसके बारे में पता नहीं था)?

+0

बहुत बढ़िया जवाब लागू करने के लिए एक मामूली संशोधन की आवश्यकता है - यह वास्तव में मैं क्या जरूरत है हो सकता है। मैं वास्तव में लॉगिंग मॉड्यूल का उपयोग कर रहा हूं, लेकिन उपयोगकर्ता को आउटपुट को रीडायरेक्ट करने और मानव पठनीय फ़ाइल प्राप्त करने का विकल्प देना चाहता हूं। लॉग स्वयं लॉगिंग मॉड्यूल द्वारा बनाया गया है (और आपके दृष्टिकोण के साथ मैं सबसे अधिक संभावना प्राप्त करूंगा जो मैं चाहता हूं)। – Escualo

+0

मैंने अभी आपके दृष्टिकोण का परीक्षण किया है और यह बिल्कुल अपेक्षित रूप से काम करता है। बहुत धन्यवाद! – Escualo

5

यदि आप टर्मिनल और लॉग फ़ाइल दोनों को प्रिंट करना चाहते हैं, तो मैं लॉगिंग मॉड्यूल का उपयोग करने का सुझाव दूंगा। केवल टर्मिनल के लिए

import optparse 
import logging 

def error(string): 
    return '\033[31;1m' + string + '\033[0m' 

def standout(string): 
    return '\033[34;1m' + string + '\033[0m' 

def plain(string): 
    return string.replace('\033[34;1m','').replace('\033[31;1m','').replace('\033[0m','') 

if __name__=='__main__': 
    logging.basicConfig(level=logging.DEBUG, 
         format='%(message)s', 
         filemode='w') 
    logger=logging.getLogger(__name__)  
    def parse_options():  
     usage = 'usage: %prog [Options]' 
     parser = optparse.OptionParser() 
     parser.add_option('-l', '--logfile', dest='logfile', 
          help='use log file') 
     opt,args = parser.parse_args() 
     return opt,args 
    opt,args=parse_options() 
    if opt.logfile: 
     class MyFormatter(logging.Formatter): 
      def format(self,record): 
       return plain(record.msg) 
     fh = logging.FileHandler(opt.logfile) 
     fh.setLevel(logging.INFO) 
     formatter = MyFormatter('%(message)s') 
     fh.setFormatter(formatter) 
     logging.getLogger('').addHandler(fh) 

    logger.info(error('There was a problem with the program')) 
    logger.info("This is normal " + standout("and this stands out")) 

test.py प्रिंट: तुम भी एक कस्टम फ़ॉर्मेटर परिभाषित कर सकते हैं, तो फाइल करने के लिए लॉग इन करने टर्मिनल कोड सफाई कर सकते हैं।

test.py -l test.out टर्मिनल और फ़ाइल test.out दोनों में प्रिंट करता है।

सभी मामलों में, टर्मिनल के पाठ में रंग कोड होते हैं, जबकि लॉगिंग में कोई नहीं होता है। नीचे

1

unubtu का जवाब बहुत अच्छा है, लेकिन मैं MyFormatter विधि प्रारूप() में स्वरूपण

class MyFormatter(logging.Formatter): 
     def format(self,record): 
      msg = super(MyFormatter, self).format(record) 
      return plain(msg) 

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

  • कोई संबंधित समस्या नहीं^_^