2010-09-12 27 views
7

¿Hay alguna manera de imprimir cadenas de forma colorida con python?imprimir cadena de colores a la consola con python

Por ejemplo, ¿puedo imprimir una parte de la cadena roja o algo así en una consola? Uso Mac OS X.

+0

imprimir? ¿Quieres decir imprimir en una consola Linux? ¿O imprimir en una consola de Windows? ¿O mostrar en una página HTML? ¿Qué quieres decir? –

Respuesta

7

Esto funciona para consolas Linux que soportan los colores:

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')) 

Aquí es un ejemplo del uso colorstr para hacer un registrador coloreada:

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!!!') 

Este ejemplo registros tanto a la consola (stderr) y un archivo (/tmp/test.log). El mensaje a la consola se colorea, pero la salida al archivo se deja en blanco.

+1

Excelente: Hubiera elegido su solución. Gracias. – Benjamin

+0

PD: imprimo ambos en la consola y registro en el archivo. En el archivo, las etiquetas de color aparecen, ¿hay alguna forma de eliminarlas al escribir en el archivo convirtiendo la cadena a algún otro formato? – Benjamin

+0

@Benjamin: ¿Está utilizando el módulo 'logging', o emitiendo declaraciones' print' separadas (una para la consola y otra para el archivo)? – unutbu

8

Puede usar colorama, pero úselo con moderación.

+2

+1. La primera vez que me enteré, ¡y funciona en Windows! Esperaba que funcionara en Linux y OS X, pero fue una agradable sorpresa. –

2

Otras alternativas son:

He jugado con ellos en Windows. No sé cómo se comportan en OSX.

1

Si desea hacer esto con un esfuerzo mínimo, puede utilizar la biblioteca tendo.colorer.

Con solo importarlo, te coloreará el registro en todas las plataformas, sin romper el registro redirigido.

También podría usarlo para mostrar mensajes de colores personalizados si lo desea, ya que contiene una biblioteca ANSI multiplataforma y un ayudante para ella.

Cuestiones relacionadas