Как печатать цветной текст в Python

Введение Для приложений CLI типично возвращать текст того же цвета, что и терминал. Всегда есть случаи, когда мы хотим выделить вывод для пользователя, например, предупреждение или сообщение об ошибке. В таких случаях цвет может иметь значение. В этой статье показано, как распечатать цветной вывод в терминале на Python с библиотеками и без них. Последовательности Escape ANSI Ваш телетайп (TTY), или, скорее, ваш терминал, способен не только отображать выходные данные программы. Это ок

Вступление

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

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

Последовательности выхода ANSI

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

Мы используем escape-последовательности / коды ANSI . Это специальные строки, которые изменяют поведение терминала. Знакомый пример - это \n , который представляет собой последовательность новой строки. При вводе этого символа выводится новая строка.

Текст на вашем терминале окрашен в соответствии с escape-последовательностями ANSI. В этой статье основное внимание уделяется escape-последовательностям для раскрашивания текста.

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

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

Начнем раскрашивать наш вывод с помощью 16-цветного варианта.

16 цветов в Raw Python

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

Синтаксис 16цветов{.ezlazyload}

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

  • 2 . Цветовые коды для красного текста переднего плана - 31 и 43 для желтого фона. Итак, имея это в виду, синтаксис для представления этого макета:

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

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

16 цветов -example1{.ezlazyload}

Это не совсем так, наш пошлый текст перетекает на следующую строку. Нам нужна точка сброса, чтобы остановить печать цветов. Это можно сделать, добавив к строке \033[0;0m

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

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

16 цветов -example1{.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-цветовой схемой:

256 цветов -синтаксис{.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") 

Это приводит к:

Логотип Stack Abuse -цветной{.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-цветной схемы, он распечатает индексы в цвета при этих значениях.

В терминале будут распечатаны обе схемы с цветовой кодировкой:

Логотип Stack Abuse -цветной{.ezlazyload}

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

Заключение

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

comments powered by Disqus