В этой статье показано, как использовать цветной вывод в терминале на 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 передних планов), и они могут быть отображены в терминале с помощью следующего синтаксиса:
Давайте проверим эту схему, напечатав цветной узор с красным жирным текстом и желтым фоном. Код стиля для представления полужирного текста равен 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 представляет собой шаблон сброса, который возвращает терминал обратно в исходную цветовую схему.
Это обеспечит следующий результат:
Согласитесь, выглядит намного лучше!
Цветной вывод в 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 при инициализации экземпляра.
Вывод программы будет выглядеть так:
Схема 256 цветов в Python
С развитием технологий 256-цветовая схема наиболее часто встречается в терминалах. Если вы используете ОС на базе Linux, вы можете проверить цветовую схему, поддерживаемую терминалом, введя следующую команду:
$ echo $TERM
Если эта команда возвращает xterm-256color, то ваш терминал поддерживает максимум 256 цветов.
Интересно, что это за цвета? Вы все узнаете сразу после того, как поймете синтаксис 256-цветовой схемы. Работа с 256 цветами немного отличается от работы с 16-цветовой схемой:
Существует заполнитель, чтобы определить, будет ли цвет применен к тексту или фону: 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")
Вывод программы:
Потрясающе! Какие еще цвета может печатать терминал? Давайте посмотрим, напечатав все 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-цветовой схемы, он распечатает индексы в цветах при этих значениях.
Это позволит распечатать обе цветовые схемы в терминале:
Это может быть очень полезно в качестве краткого руководства при создании утилит командной строки.
Заключение
В этом уроке я рассказал, как печатать цветные выходные данные для символов, которые мы отправляем в поток stdout. Я показал, как это сделать с помощью встроенных функций Python, а также как использовать библиотеку Colorama.
Ссылка на оригинал статьи: stackabuse.com/how-to-print-colored-text-in-python/
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)
print(‘\033[2;31;43m CHESSY’)
у меня выводит синим строку:
[2;31;43m CHESSY
Что я делаю не так?
Да,поздно я нашла ваш сайт,а то у всех все выпрашивала на работе,сисадмины просто терпеть не могли меня,тупенькую,теперь я все сама на зависть коллег.Спасибо за источник
Пожалуйста