Cómo imprimir texto en color en Python

Este artículo le muestra cómo podemos imprimir resultados en color en la terminal con y sin bibliotecas de Python. ¡Vamos a sumergirnos aprendiendo cómo funciona!

Introducción

Es típico que las aplicaciones CLI devuelvan texto en el mismo color del terminal. Siempre hay casos en los que queremos resaltar la salida para el usuario, por ejemplo, un mensaje de advertencia o error. En esos casos, un toque de color podría marcar la diferencia.

Este artículo le muestra cómo imprimir una salida en color en la terminal en Python con y sin bibliotecas.

Secuencias de escape ANSI

Tu Teletypewriter (TTY), o más bien tu terminal, no sólo es capaz de mostrar la salida de un programa. Puede mostrar un cursor en movimiento, colorear el texto, borrar toda la pantalla y mucho más que una salida estática. Es posible que haya visto utilidades de línea de comandos con texto colorido y barras de progreso. ¿Cómo controlamos la presentación de los datos que enviamos al terminal?

Usamos ANSI Escape Sequences/Codes. Estas son cadenas especiales que modifican el comportamiento de la terminal. Un ejemplo familiar sería el carácter \n, que es una secuencia Nueva línea. Ingresar este carácter imprimirá una nueva línea en la salida.

El texto está coloreado en su terminal según las secuencias de escape ANSI. Este artículo se centra en las secuencias de escape para colorear el texto.

Dos esquemas de color son muy utilizados en los terminales:

  • 16 colores (8 de fondo + 8 de primer plano)
  • 256 colores

Comencemos a colorear nuestra salida con la opción de 16 colores.

16 colores en Python sin procesar

El esquema de 16 colores comprende dos conjuntos de 8 colores cada uno (8 fondos y 8 primeros planos) y se pueden mostrar en el terminal utilizando la siguiente sintaxis:

16 colors syntax

Pongamos esto a prueba, imprimiendo un patrón de color cursi con un texto rojo en negrita y un fondo amarillo. El código de estilo para representar el texto en negrita es 2. Los códigos de color para el texto rojo de primer plano son 31 y 43 para el fondo amarillo. Entonces, con eso en mente, la sintaxis para representar este diseño es:

1
print('\033[2;31;43m CHEESY')

Ejecute el comando anterior en su intérprete de Python (o un archivo). Verá esta salida:

16 colors - example1

Eso no es del todo correcto, nuestro texto cursi se está extendiendo a la siguiente línea. Necesitamos un punto de reinicio para detener la impresión de colores. Esto se puede hacer añadiendo \033[0;0m a la cadena como:

1
print('\033[2;31;43m CHEESY \033[0;0m')

El código \033[0;0m representa un patrón de reinicio que devuelve el terminal a su esquema de color original. Esto proporcionará el siguiente resultado:

16 colors - example1

se ve mucho mejor

16 colores en Colorama: un módulo incorporado

Colorama es un paquete de Python que proporciona métodos para imprimir texto en color en Python. Solo admite el esquema de 16 colores. El módulo prepara las secuencias de escape ANSI para producir el texto en color. Instalemos el módulo con pip:

1
$ pip install colorama

Te recomendamos instalarlo dentro de un ambiente virtual. Una vez configurado, vamos a imprimir texto en color con Colorama:

1
2
3
4
5
6
7
# colorama_demo.py
from colorama import init, Fore, Back, Style

# Initializes Colorama
init(autoreset=True)

print(Style.BRIGHT + Back.YELLOW + Fore.RED + "CHEESY")

Primero importamos las funciones: init() (para inicializar el módulo y establecer autoreset en True para que no tengamos que restablecerlo manualmente), Fore (objeto de texto en primer plano), Back (objeto de fondo) y Style (objeto de estilo). Cada objeto tiene su propio conjunto de constantes que se pueden llamar en la función print().

Al agregar estos componentes de una manera amigable para los humanos, Colorama convierte valores como ‘AMARILLO’ a ‘43’, para el objeto ‘Atrás’, ‘RED’ a ‘31’ para el objeto ‘Adelante’, etc. terminamos con una secuencia ANSI, al igual que la última vez, sin embargo, no tenemos que conocer los códigos nosotros mismos: Colorama lo hace por nosotros.

No se requiere un patrón de reinicio, ya que configuramos el argumento autoreset en True al inicializar la instancia.

Ejecutar el código mostrará esto:

Colorama - example

256 colores en Python sin procesar

Con el avance de las tecnologías, el esquema de 256 colores es el más común en los terminales. Si tiene un sistema operativo basado en Linux, puede verificar el esquema de color compatible con su terminal ingresando el siguiente comando:

1
$ echo $TERM

Si este comando devuelve xterm-256color, entonces su terminal admite un máximo de 256 colores.

¿Te preguntas cuáles son esos colores?

Podemos sumergirnos justo después de entender la sintaxis de un esquema de 256 colores. Trabajar con 256 colores es un poco diferente a trabajar con el esquema de 16 colores:

256 colors - syntax

Hay un marcador de posición para determinar si el color se aplicará al texto o al fondo; 38;5; es para el texto y 48;5; es para el fondo. A esto le sigue el código de color que va de 0 a 255.

Según la sintaxis anterior, intentemos recrear el logotipo de wikihtp en Python usando una secuencia de escape ANSI.

El logotipo contiene un fondo gris pálido (\033[48;5;236m) con las palabras: Stack en blanco (\033[38;5;231m) y Abuse en naranja (\033 [38;5;208m). Y, por supuesto, el código de reinicio debe estar incrustado en la cadena.

Dicho esto, podemos recrear el logotipo con esta secuencia ANSI:

1
>>> print("\033[48;5;236m\033[38;5;231mStack \033[38;5;208mAbuse\033[0;0m")

Esto resulta en:

Stack Abuse Logo - in Color

¡Impresionante! ¿Qué otros colores puede imprimir el terminal? Echemos un vistazo, imprimiendo todos los 256 colores admitidos por el terminal:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# colorspep8.py
def colors_16(color_):
    return("\033[2;{num}m {num} \033[0;0m".format(num=str(color_)))


def colors_256(color_):
    num1 = str(color_)
    num2 = str(color_).ljust(3, ' ')
    if color_ % 16 == 0:
        return(f"\033[38;5;{num1}m {num2} \033[0;0m\n")
    else:
        return(f"\033[38;5;{num1}m {num2} \033[0;0m")

print("The 16 colors scheme is:")
print(' '.join([colors_16(x) for x in range(30, 38)]))
print("\nThe 256 colors scheme is:")
print(' '.join([colors_256(x) for x in range(256)]))

Este script contiene dos funciones que imprimen la variable que les pasa, en las respectivas secuencias de escape ANSI. Una vez que ejecutamos el script y pasamos x en un cierto rango, como (30,38] para el esquema de 16 colores, o (0-255] para el esquema de 256 colores, \ Imprimiré los índices en los colores en esos valores.

Esto imprimirá ambos esquemas codificados por colores en la terminal:

Stack Abuse Logo - in Color

Esto puede ser muy útil como referencia rápida al crear utilidades de línea de comandos.

Conclusión

En este tutorial, hemos repasado cómo imprimir una salida en color, para los caracteres que enviamos a la secuencia stdout. Hemos explorado cómo hacer esto usando la funcionalidad integrada que ofrece Python, así como también cómo usar la biblioteca Colorama.