Вступление
Для приложений CLI типично возвращать текст того же цвета, что и терминал. Всегда есть случаи, когда мы хотим выделить вывод для пользователя, например, предупреждение или сообщение об ошибке. В таких случаях цвет может иметь значение.
В этой статье показано, как распечатать цветной вывод в терминале на Python с библиотеками и без них.
Последовательности выхода ANSI
Ваш телетайп (TTY) или, скорее, ваш терминал не только способен отображать вывод программы. Он может отображать движущийся курсор, раскрашивать текст, очищать весь экран и многое другое, чем просто статический вывод. Возможно, вы видели утилиты командной строки с красочным текстом и индикаторами выполнения. Как мы контролируем представление данных, которые мы выводим на терминал?
Мы используем escape-последовательности / коды ANSI . Это специальные
строки, которые изменяют поведение терминала. Знакомый пример - это \n
, который представляет собой последовательность новой строки. При
вводе этого символа выводится новая строка.
Текст на вашем терминале окрашен в соответствии с escape-последовательностями ANSI. В этой статье основное внимание уделяется escape-последовательностям для раскрашивания текста.
В терминалах широко используются две цветовые схемы:
- 16 цветов (8 фоновых + 8 передних)
- 256 цветов
Начнем раскрашивать наш вывод с помощью 16-цветного варианта.
16 цветов в Raw Python
Схема из 16 цветов включает два набора по 8 цветов в каждом (8 фонов и 8 передних планов), и их можно отобразить в терминале, используя следующий синтаксис:
{.ezlazyload}
Давайте проверим это, напечатав нежный цветной узор с красным жирным шрифтом и желтым фоном. Код стиля для представления полужирного текста
-
2
. Цветовые коды для красного текста переднего плана -31
и43
для желтого фона. Итак, имея это в виду, синтаксис для представления этого макета:print(’\033[2;31;43m CHEESY')
Выполните указанную выше команду в интерпретаторе Python (или в файле). Вы увидите этот вывод:
{.ezlazyload}
Это не совсем так, наш пошлый текст перетекает на следующую строку. Нам
нужна точка сброса, чтобы остановить печать цветов. Это можно сделать,
добавив к строке \033[0;0m
print('\033[2;31;43m CHEESY \033[0;0m')
Код \033[0;0m
представляет собой шаблон сброса, который возвращает
терминал к его исходной цветовой схеме. Это даст следующий результат:
{.ezlazyload}
Смотрится намного лучше.
16 цветов в 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
при инициализации экземпляра.
Запуск кода отобразит это:
{.ezlazyload}
256 цветов в Raw Python
С развитием технологий 256-цветная схема чаще всего встречается в терминалах. Если вы работаете в ОС на базе Linux, вы можете проверить цветовую схему, поддерживаемую терминалом, введя следующую команду:
$ echo $TERM
Если эта команда возвращает xterm-256color
, значит, ваш терминал
поддерживает максимум 256 цветов.
Хотите знать, что это за цвета?
Мы можем приступить к делу сразу после того, как разберемся с синтаксисом 256-цветовой схемы. Работа с 256 цветами немного отличается от работы с 16-цветовой схемой:
{.ezlazyload}
Есть заполнитель, чтобы определить, будет ли цвет применяться к тексту или к фону; 38; 5; для текста и 48; 5; для фона. Далее следует цветовой код от 0 до 255 .
Основываясь на приведенном выше синтаксисе, давайте попробуем воссоздать логотип StackAbuse в Python с помощью ANSI Escape Sequence.
Логотип содержит бледно-серый фон ( \033[48;5;236m
) со словами:
Stack in white ( \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")
Это приводит к:
{.ezlazyload}
Потрясающие! Какие еще цвета может печатать терминал? Давайте посмотрим, распечатав все 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. Как только
мы запустим скрипт и передадим x
в определенном диапазоне, например
(30,38]
для 16-цветовой схемы или (0-255]
для 256-цветной схемы, он
распечатает индексы в цвета при этих значениях.
В терминале будут распечатаны обе схемы с цветовой кодировкой:
{.ezlazyload}
Это может быть очень полезно в качестве краткого справочника при создании утилит командной строки.
Заключение
В этом руководстве мы рассмотрели, как распечатать цветной вывод для
символов, которые мы отправляем в поток stdout
Мы изучили, как это
сделать, используя встроенные функции Python, а также как использовать
библиотеку Colorama.