Используем цветной вывод в Python 3

Используем цветной вывод в Python 3

В этой статье показано, как использовать цветной вывод в терминале на Python используя библиотеки и стандартные средства.

Введение

Вернуть текст в том же цвете терминала — типично для приложений CLI. Всегда есть случаи, когда мы хотим выделить вывод для пользователя, например, предупреждение или сообщение об ошибке. В этих случаях цветовая передача может иметь значение.

ANSI Escape Sequences

Ваш TeleTypeWriter (TTY), или, скорее, ваш терминал, не только способен показывать вывод программы, он также может отображать движущийся курсор, окрашивать текст, очищать весь экран и многое другое, чем просто статический вывод.

Возможно, вы видели утилиты командной строки с красочным текстом и индикаторами выполнения. Как мы контролируем представление данных, которые мы выводим на терминал?

Мы используем ANSI Escape Sequences/Codes (sequences — последовательности). Это специальные строки, которые изменяют поведение терминала. Знакомым примером может служить символ \n, представляющий собой новую последовательность строк. Ввод этого символа приведет к печати новой строки в выходных данных.

Текст окрашивается на вашем терминале на основе ANSI Escape Sequences. Эта статья посвящена ANSI Escape последовательностям, для того чтобы применить цветной вывод.

В терминалах широко используются две цветовые схемы:

  • 16 цветов (8 фоновых + 8 передних)
  • 256 цветов

Давайте начнем раскрашивать наши выходные данные с помощью опции 16 цветов.

Схема 16 цветов в Python

16-цветовая схема состоит из двух наборов по 8 цветов в каждом (8 фонов и 8 передних планов), и они могут быть отображены в терминале с помощью следующего синтаксиса:

16 colors syntax

Давайте проверим эту схему, напечатав цветной узор с красным жирным текстом и желтым фоном. Код стиля для представления полужирного текста равен 2. Цветовые коды для красного текста переднего плана-31 и 43 для желтого фона.

Итак, чтобы получить этот макет, пишем:

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

Выполните приведенную выше команду в вашем интерпретаторе Python (или в файле).

Вы увидите следующий вывод:

16 colors - example1

Как видно, наш текст перетекает на следующую строчку. Нам нужна точка сброса, чтобы остановить печать цветов.

Это можно сделать, добавив \033[0;0m к строке следующим образом:

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

Код \033[0;0m представляет собой шаблон сброса, который возвращает терминал обратно в исходную цветовую схему.

Это обеспечит следующий результат:

16 colors - example1

Согласитесь, выглядит намного лучше!

Цветной вывод в Colorama

Colorama — это пакет Python, который предоставляет цветной вывод текста на Python. Он поддерживает только 16-цветовую схему. Модуль подготавливает Escape ANSI последовательности для получения цветного текста.

Давайте установим модуль с помощью pip:

pip install colorama

Мы рекомендуем вам установить его в виртуальной среде.

После настройки давайте перейдем к печати цветного текста с помощью Colorama:

# colorama_demo.py 
from colorama import init, Fore, Back, Style 

# Initializes Colorama 
init(autoreset=True) 

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

Сначала я импортирую функции init, чтобы инициализировать модуль и установить autoreset в True, чтобы нам не пришлось сбрасывать его вручную, Fore (текстовый объект переднего плана), Back (фоновый объект) и Style (объект стиля). Каждый объект имеет свой собственный набор констант, которые могут быть вызваны в функции print.

Добавляя эти компоненты удобным для человека способом, Colorama преобразует значения, такие как YELLOW (жёлтый цвет) в 43, для фонового объекта Back, RED (красный) в 31 для переднего объекта Fore и так далее. Так я получаю последовательность ANSI, как и в прошлый раз, хотя нам не нужно знать коды самим — Colorama делает это за нас.

Шаблон сброса не требуется, так как я установил аргумент autoreset в значение True при инициализации экземпляра.

Вывод программы будет выглядеть так:

Colorama - example

Схема 256 цветов в Python

С развитием технологий 256-цветовая схема наиболее часто встречается в терминалах. Если вы используете ОС на базе Linux, вы можете проверить цветовую схему, поддерживаемую терминалом, введя следующую команду:

$ echo $TERM

Если эта команда возвращает xterm-256color, то ваш терминал поддерживает максимум 256 цветов.

Интересно, что это за цвета? Вы все узнаете сразу после того, как поймете синтаксис 256-цветовой схемы. Работа с 256 цветами немного отличается от работы с 16-цветовой схемой:

256 colors - syntax

Существует заполнитель, чтобы определить, будет ли цвет применен к тексту или фону: 38;5; — для текста и 48;5; — для фона. Затем следует цветовой код в диапазоне от 0 до 255.

Основываясь на приведенном выше синтаксисе, давайте попробуем воссоздать логотип StackAbuse в Python с помощью последовательности Escape ANSI.

Логотип содержит бледно-серый фон (\033[48;5;236m) со словами: Stack белого цвета (\033[38;5;231m) и Abuse оранжевого цвета (\033[38;5;208m). И конечно, код сброса должен быть встроен в строку.

Тем не менее, мы можем воссоздать логотип с помощью этой последовательности ANSI:

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

Вывод программы:

Stack Abuse Logo - in Color

Потрясающе! Какие еще цвета может печатать терминал? Давайте посмотрим, напечатав все 256 цветов, поддерживаемых терминалом:

# 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)]))

Этот код содержит две функции, которые печатают переменную, которую вы передаете в них, в соответствующих последовательностях Escape ANSI. Как только я запущу скрипт и передам Х в определенном диапазоне, например (30,38] для 16-цветовой схемы или (0-255] для 256-цветовой схемы, он распечатает индексы в цветах при этих значениях.

Это позволит распечатать обе цветовые схемы в терминале:

Stack Abuse Logo - in Color

Это может быть очень полезно в качестве краткого руководства при создании утилит командной строки.

Заключение

В этом уроке я рассказал, как печатать цветные выходные данные для символов, которые мы отправляем в поток stdout. Я показал, как это сделать с помощью встроенных функций Python, а также как использовать библиотеку Colorama.

Ссылка на оригинал статьи: stackabuse.com/how-to-print-colored-text-in-python/

Егор Егоров

Программирую на Python с 2017 года. Люблю создавать контент, который помогает людям понять сложные вещи. Не представляю жизнь без непрерывного цикла обучения, спорта и чувства юмора.

Ссылка на мой github есть в шапке. Залетай.

Оцените автора
Егоров Егор
Добавить комментарий

  1. Andy

    from colorama import init, Fore, Back, Style
    init(autoreset=True)
    print(Style.BRIGHT + Back.YELLOW + Fore.RED + «CHEESY»)

    Traceback (most recent call last):
    File «C:/…/colorama2.py», line 3, in
    from colorama import init, Fore, Back, Style
    File «C:\…\colorama.py», line 2, in
    from colorama import init, Fore, Back
    ImportError: cannot import name ‘init’ from partially initialized module ‘colorama’ (most likely due to a circular import) (C:\…\colorama.py)

    Ответить
  2. Andy

    print(‘\033[2;31;43m CHESSY’)
    у меня выводит синим строку:
    [2;31;43m CHESSY

    Что я делаю не так?

    Ответить
  3. Севи

    Да,поздно я нашла ваш сайт,а то у всех все выпрашивала на работе,сисадмины просто терпеть не могли меня,тупенькую,теперь я все сама на зависть коллег.Спасибо за источник

    Ответить
    1. Егор Егоров автор

      Пожалуйста

      Ответить