Автор оригинала: Sathiya Sarathi Gunasekaran.
Вступление
Это типично для приложений CLI, чтобы вернуть текст в том же цвете терминала. Всегда есть случаи, когда мы хотим выделить вывод для пользователя, например, предупреждение или сообщение об ошибке. В этих случаях цветовая черта может иметь значение.
В этой статье показано, как печатать цветные выходные данные в терминале на Python с библиотеками и без них.
Escape-последовательности ANSI
Ваш Teletypewriter (TTY), или, скорее, ваш терминал, не только способен показывать вывод программы. Он может отображать движущийся курсор, окрашивать текст, очищать весь экран и многое другое, чем просто статический вывод. Возможно, вы видели утилиты командной строки с красочным текстом и индикаторами выполнения. Как мы контролируем представление данных, которые мы выводим на терминал?
Мы используем Escape-последовательности ANSI/Коды . Это специальные строки, которые изменяют поведение терминала. Знакомым примером может служить символ \n
, представляющий собой последовательность New Line . Ввод этого символа приведет к печати новой строки в выходных данных.
Текст окрашивается на вашем терминале на основе Escape-последовательностей ANSI. Эта статья посвящена escape-последовательностям для цветного текста.
В терминалах широко используются две цветовые схемы:
- 16 цветов (8 фоновых + 8 передних)
- 256 цветов
Давайте начнем раскрашивать ваш вывод с помощью опции 16 цветов.
16 Цветов в необработанном питоне
Схема 16 цветов включает в себя два набора по 8 цветов каждый (8 фонов и 8 передних планов), и они могут быть отображены в терминале с помощью следующего синтаксиса:
Давайте проверим это, напечатав дрянной цветной узор с красным жирным текстом и желтым фоном. Код стиля для представления полужирного текста 2
. Цветовые коды для красного текста переднего плана 31
и 43
для желтого фона. Итак, имея это в виду, синтаксис для представления этого макета таков:
print('\033[2;31;43m CHEESY')
Выполните приведенную выше команду в вашем интерпретаторе Python (или файле). Вы увидите этот вывод:
Это не совсем так, наш дрянной текст перетекает на следующую строчку. Нам нужна точка сброса, чтобы остановить печать цветов. Это можно сделать, добавив \033[0;0m
к строке как:
print('\033[2;31;43m CHEESY \033[0;0m')
Код \033[0;0m
представляет собой шаблон сброса, который возвращает терминал обратно в исходную цветовую схему. Это обеспечит следующий результат:
Выглядит гораздо лучше.
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
to 31
для объекта Fore
и т. Д. Под капотом мы получаем последовательность ANSI, как и в прошлый раз, хотя нам не нужно знать коды самим – Colorama делает это за нас.
Шаблон сброса не требуется, так как мы установили аргумент autoreset
в True
при инициализации экземпляра.
Запуск кода покажет это:
256 Цветов в Raw Python
С развитием технологий 256-цветовая схема наиболее часто встречается в терминалах. Если вы используете ОС на базе Linux, вы можете проверить цветовую схему, поддерживаемую терминалом, введя следующую команду:
$ echo $TERM
Если эта команда возвращает xterm-256color
, то ваш терминал поддерживает максимум 256 цветов.
Интересно, что это за цвета?
Мы можем погрузиться сразу после того, как поймем синтаксис 256-цветовой схемы. Работа с 256 цветами немного отличается от работы с 16-цветовой схемой:
Есть заполнитель, чтобы определить, будет ли цвет применен к тексту или фону; 38;5; – для текста и 48;5; – для фона. За этим следует цветовой код в диапазоне от 0 чтобы 255 .
Основываясь на приведенном выше синтаксисе, давайте попробуем воссоздать логотип Stack Abuse в Python с помощью Escape-последовательности ANSI.
Логотип содержит бледно-серый фон ( \033[48;5;236 м
) со словами: Застрял в белом ( \033[38;5;231m
) и Злоупотребление в оранжевом цвете ( \033[38;5;208м
). И конечно, код сброса должен быть встроен в строку.
Тем не менее, мы можем воссоздать логотип с помощью этой последовательности ANSI:
>>> print("\033[48;5;236m\033[38;5;231mStack \033[38;5;208mAbuse\033[0;0m")
Это приводит к:
Потрясающе! Какие еще цвета может печатать терминал? Давайте посмотрим, напечатав все 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-цветовой схемы, он распечатает индексы в цветах при этих значениях.
Это позволит распечатать обе цветовые схемы в терминале:
Это может быть очень полезно в качестве краткого руководства при создании утилит командной строки.
Вывод
В этом уроке мы рассмотрели, как печатать цветные выходные данные для символов, которые мы отправляем в поток stdout
. Мы изучили, как это сделать с помощью встроенных функций Python, а также как использовать библиотеку Colorama.