2010-09-12 13 views
7

C'è un modo per stampare una stringa in modo colorato con python?stampa corde colorate per console con python

Ad esempio, posso stampare parte della stringa rossa o qualcosa in una console? Uso Mac OS X.

+0

stampa? Intendi dire stampare su una console Linux? O stampare su una console Windows? O visualizzare in una pagina HTML? Cosa intendi? –

risposta

7

Questo funziona per le console Linux che supportano il colore:

CODE={ 
    'ENDC':0, # RESET COLOR 
    'BOLD':1, 
    'UNDERLINE':4, 
    'BLINK':5, 
    'INVERT':7, 
    'CONCEALD':8, 
    'STRIKE':9, 
    'GREY30':90, 
    'GREY40':2, 
    'GREY65':37, 
    'GREY70':97, 
    'GREY20_BG':40, 
    'GREY33_BG':100, 
    'GREY80_BG':47, 
    'GREY93_BG':107, 
    'DARK_RED':31, 
    'RED':91, 
    'RED_BG':41, 
    'LIGHT_RED_BG':101, 
    'DARK_YELLOW':33, 
    'YELLOW':93, 
    'YELLOW_BG':43, 
    'LIGHT_YELLOW_BG':103, 
    'DARK_BLUE':34, 
    'BLUE':94, 
    'BLUE_BG':44, 
    'LIGHT_BLUE_BG':104, 
    'DARK_MAGENTA':35, 
    'PURPLE':95, 
    'MAGENTA_BG':45, 
    'LIGHT_PURPLE_BG':105, 
    'DARK_CYAN':36, 
    'AUQA':96, 
    'CYAN_BG':46, 
    'LIGHT_AUQA_BG':106, 
    'DARK_GREEN':32, 
    'GREEN':92, 
    'GREEN_BG':42, 
    'LIGHT_GREEN_BG':102, 
    'BLACK':30, 
} 

def termcode(num): 
    return '\033[%sm'%num 

def colorstr(astr,color): 
    return termcode(CODE[color])+astr+termcode(CODE['ENDC']) 

if __name__=='__main__': 
    astr='yippy skippy' 
    # for num in range(300): 
    #  color=termcode(num) 
    #  print('%s: %s'%(num,color+astr+termcode(CODE['ENDC']))) 
    for key in sorted(CODE.keys()): 
     print('%s: %s'%(key,colorstr(astr,key))) 

    print(colorstr('Red','RED')) 

Ecco un esempio di utilizzo colorstr per fare un logger colorato:

import logging 
import copy 

logger=logging.getLogger(__name__) 

class ColoredFormatter(logging.Formatter): 
    # A variant of code found at http://stackoverflow.com/questions/384076/how-can-i-make-the-python-logging-output-to-be-colored 
    LEVELCOLOR = { 
     'DEBUG': 'BLUE', 
     'INFO': 'BLACK', 
     'WARNING': 'PURPLE', 
     'ERROR': 'RED', 
     'CRITICAL': 'RED_BG', 
     } 

    def __init__(self, msg): 
     logging.Formatter.__init__(self, msg) 

    def format(self, record): 
     record = copy.copy(record) 
     levelname = record.levelname 
     if levelname in self.LEVELCOLOR: 
      record.levelname = colorstr(levelname,self.LEVELCOLOR[levelname]) 
      record.name = colorstr(record.name,'BOLD') 
      record.msg = colorstr(record.msg,self.LEVELCOLOR[levelname]) 
     return logging.Formatter.format(self, record) 

if __name__=='__main__': 
    logger.setLevel(logging.DEBUG) 
    console = logging.StreamHandler() 
    console.setFormatter(
     ColoredFormatter('%(name)s: %(message)s (%(filename)s:%(lineno)d)')) 
    logger.addHandler(console) 
    fh = logging.FileHandler('/tmp/test.log','w') 
    fh.setFormatter(logging.Formatter('%(name)s: %(message)s')) 
    logger.addHandler(fh) 

    logger.debug('debug') 
    logger.info('info') 
    logger.warning('Warning') 
    logger.error('ERROR') 
    logger.critical('CRITICAL!!!') 

Questo esempio i log sia per la console (stderr) e un file (/tmp/test.log). Il messaggio alla console è colorato, ma l'output del file è chiaro.

+1

Eccellente: avrei scelto la soluzione. Grazie. – Benjamin

+0

PS: I entrambi stampa su console e accedere al file. Su file, vengono visualizzati i tag dei colori, esiste un modo per rimuoverli quando si scrive su un file convertendo la stringa in un altro formato? – Benjamin

+0

@Benjamin: stai usando il modulo 'logging', o emetti istruzioni' print' separate (una per la console, una per il file)? – unutbu

8

È possibile utilizzare colorama, ma usarlo con parsimonia.

+2

+1. La prima volta che ne ho sentito parlare, e funziona su Windows! Mi aspettavo che funzionasse su Linux e OS X, ma è stata una piacevole sorpresa. –

2

Altre alternative sono:

Ho giocato con loro in Windows. Non so come si comportano in OSX.

1

Se si desidera eseguire questa operazione con il minimo sforzo, è possibile utilizzare la libreria tendo.colorer.

Basta importarlo per colorare l'accesso su tutte le piattaforme, senza interrompere il registro reindirizzato.

Inoltre, è possibile utilizzarlo per visualizzare messaggi colorati personalizzati se lo si desidera, poiché contiene una libreria ANSI multipiattaforma e un helper per esso.