Как я могу вывести цветной текст на терминал в Python?

2668
aboSamoor 13 Ноя 2008 в 21:58
Этот символ мог бы стать отличным цветным блоком: Проблема только в том, что он является расширенным ASCII, возможно, вы могли бы заставить его работать, используя http://stackoverflow.com/questions/8465226/using-extended-ascii-codes-with-python
 – 
Samie Bencherif
5 Окт 2013 в 20:14
Некоторые терминалы также могут отображать символы Unicode. Если это верно для вашего терминала, количество возможных символов практически неограничено.
 – 
ayke
20 Ноя 2013 в 00:02
7
Этот ответ пришел довольно поздно, но мне он кажется лучшим ... те, кто проголосовал выше, требуют специальных хаков для Windows, тогда как этот просто работает: stackoverflow.com/a/3332860/901641
 – 
ArtOfWarfare
16 Дек 2013 в 20:59
Как насчет stackoverflow.com/a/42528796/610569 с использованием pypi.python.org/pypi/lazyme? (отказ от ответственности: бессовестная вилка)
 – 
alvas
1 Мар 2017 в 13:12
Если вы не хотите устанавливать дополнительный пакет, следуйте этому новому ответу.
 – 
Benyamin Jafari
24 Мар 2021 в 14:41

33 ответа

Это в некоторой степени зависит от того, на какой платформе вы находитесь. Наиболее распространенный способ сделать это - распечатать escape-последовательности ANSI. В качестве простого примера приведем код Python из Скрипты сборки Blender:

class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKCYAN = '\033[96m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'

Чтобы использовать такой код, вы можете сделать что-то вроде:

print(bcolors.WARNING + "Warning: No active frommets remain. Continue?" + bcolors.ENDC)

Или с Python 3.6+:

print(f"{bcolors.WARNING}Warning: No active frommets remain. Continue?{bcolors.ENDC}")

Это будет работать в Unix, включая OS X, Linux и Windows (при условии, что вы используете ANSICON, или в Windows 10, предоставленной вы включаете эмуляцию VT100). Существуют коды ANSI для настройки цвета, перемещения курсора и т. Д.

Если вы собираетесь усложнить это (а это похоже на то, что вы пишете игру), вам следует заглянуть в "curses", который выполняет множество сложных задач за вас. Python Curses HowTO - хорошее введение.

Если вы не используете расширенный ASCII (то есть не на ПК), вы застряли с символами ASCII ниже 127, и '#' или '@', вероятно, лучший выбор для блока. Если вы можете убедиться, что ваш терминал использует расширенный набор символов ASCII IBM, у вас есть гораздо больше опции. Символы 176, 177, 178 и 219 являются «символами блока».

Некоторые современные текстовые программы, такие как "Dwarf Fortress", имитируют текстовый режим в графическом режиме и используют изображения классического шрифта для ПК. Вы можете найти некоторые из этих растровых изображений, которые можно использовать на Dwarf Fortress Wiki см. ( пользовательские наборы фрагментов ).

Демо-конкурс текстового режима содержит больше ресурсов для создания графики в тексте. режим.

2341
Peter Mortensen 9 Янв 2021 в 19:45
9
В Linux вы можете захотеть использовать tput, вот так, поскольку это делает его более портативным код.
 – 
Martin Ueding
3 Ноя 2012 в 15:04
4
@Cawas: Реальный вариант использования disable - это когда вы передаете вывод в файл; Хотя такие инструменты, как cat могут поддерживать цвета, обычно лучше не печатать информацию о цвете в файлах.
 – 
Sebastian Mach
9 Апр 2014 в 10:27
7
@AlexanderSimko, вот фрагмент кода ctypes для включения поддержки VT100 в Windows 10: import ctypes; kernel32 = ctypes.WinDLL('kernel32'); hStdOut = kernel32.GetStdHandle(-11); mode = ctypes.c_ulong(); kernel32.GetConsoleMode(hStdOut, ctypes.byref(mode)); mode.value |= 4; kernel32.SetConsoleMode(hStdOut, mode).
 – 
Eryk Sun
2 Сен 2016 в 02:38
5
Всем, кто использует пример кода Python из ответа: следует отметить, что цвета в диапазоне 90-97 и 100-107 являются нестандартными и, действительно, на моем терминале они не все имеют цвета, указанные в именах переменных. Лучше использовать стандартные диапазоны 30-37 и 40-47. Источник: en.wikipedia.org/wiki/…
 – 
balu
8 Окт 2017 в 12:27

Также существует модуль Python termcolor. Использование довольно простое:

from termcolor import colored

print colored('hello', 'red'), colored('world', 'green')

Или в Python 3:

print(colored('hello', 'red'), colored('world', 'green'))

Однако он может быть недостаточно сложным для программирования игр и «цветных блоков», которые вы хотите сделать ...

986
Peter Mortensen 9 Янв 2021 в 19:59
2
Поскольку он выдает коды ANSI, работает ли он в Windows (консоли DOS), если загружен файл ansi.sys? support.microsoft.com/kb/101875
 – 
Phil P
29 Июл 2011 в 08:16
41
Только что заметил, что по состоянию на 13.01.2011 он теперь под лицензией MIT.
 – 
Alexander Tsepkov
28 Окт 2011 в 06:19
16
Не имеет юнит-тестов (в отличие от colorama) и не обновляется с 2011 г.
 – 
Janus Troelsen
20 Июл 2013 в 23:28
5
termcolor.COLORS дает вам список цветов
 – 
akxlr
14 Ноя 2015 в 05:05
55
В Windows сначала запустите os.system('color'), затем начнут работать escape-последовательности ANSI.
 – 
Szabolcs
12 Дек 2018 в 19:53

Ответ - Colorama для всех кроссплатформенных раскрасок в Python.

Он поддерживает Python 3.5+, а также Python 2.7.

И по состоянию на январь 2021 года он сохраняется.

Пример снимка экрана: пример снимка экрана

882
Greg Dubicki 1 Янв 2021 в 14:41
420
Как автор Colorama, спасибо за упоминание @ nbv4. Я попытаюсь немного уточнить: Colorama стремится позволить программам Python печатать цветной текст терминала на всех платформах, используя те же коды ANSI, что описаны во многих других ответах на этой странице. В Windows Colorama удаляет эти символы ANSI из стандартного вывода и преобразует их в эквивалентные вызовы win32 для цветного текста. На других платформах Colorama ничего не делает. Следовательно, вы можете использовать коды ANSI или модули, такие как Termcolor, а с Colorama они «просто работают» на всех платформах. Во всяком случае, это идея?
 – 
Jonathan Hartley
13 Сен 2010 в 17:22
4
@Jonathan, это действительно классная библиотека! Возможность кросс-платформенного вывода цвета на Python действительно хороша и полезна. Я предоставляю инструменты для библиотеки, которая раскрашивает собственную консоль. Я могу перенаправить вывод этой консоли на терминал и раскрасить вывод. Теперь я могу даже увеличить библиотеку и позволить пользователю выбирать цвета. Это позволит дальтоникам настроить вещи так, чтобы они действительно могли правильно видеть результат. Спасибо
 – 
Demolishun
30 Ноя 2012 в 17:05
69
Это должно быть в стандартной библиотеке ... Думаю, кроссплатформенная поддержка цветов важна.
 – 
daviewales
28 Июн 2013 в 18:08
9
Колорама великолепна! Также ознакомьтесь с ansimarkup, который построен на основе colorama и позволяет использовать простой тег разметка на основе (например, <b>bold</b>) для добавления стиля к тексту терминала
 – 
gvalkov
19 Фев 2017 в 20:07
54
Это не работает без вызова colorama.init (). Проголосуйте!
 – 
Smit Johnth
19 Фев 2018 в 06:32

Распечатайте строку, с которой начинается цвет / стиль, затем строку, а затем завершите изменение цвета / стиля с помощью '\x1b[0m':

print('\x1b[6;30;42m' + 'Success!' + '\x1b[0m')

Success with green background example

Получите таблицу параметров формата для текста оболочки с помощью следующего кода:

def print_format_table():
    """
    prints table of formatted text format options
    """
    for style in range(8):
        for fg in range(30,38):
            s1 = ''
            for bg in range(40,48):
                format = ';'.join([str(style), str(fg), str(bg)])
                s1 += '\x1b[%sm %s \x1b[0m' % (format, format)
            print(s1)
        print('\n')

print_format_table()

Пример "свет на темноте" (полный)

Enter image description here

Пример темного на светлом (частичный)

Top part of output

542
Peter Mortensen 9 Янв 2021 в 20:07
9
Это работает в большинстве оболочек, а также в ipython, что достаточно для большинства приложений.
 – 
dashesy
18 Фев 2014 в 10:13
4
Могу я спросить, что это за терминал?
 – 
FlipTack
3 Дек 2016 в 20:53
4
Насколько это портативно?
 – 
Ruggero Turra
12 Янв 2017 в 00:17
3
Краткая автономная реализация: gist.github.com/Sheljohn/68ca3be74139f66dbc6127784f638920
 – 
Jonathan H
7 Мар 2017 в 18:34
Это будет работать в любом терминале / консоли, поддерживающей escape-последовательности ANSI.
 – 
wjandrea
5 Авг 2020 в 18:12

Вот решение, которое изначально работает в Windows 10.

Использование системного вызова, такого как os.system(""), позволяет печатать цвета непосредственно в командной строке и Powershell:

import os

# System call
os.system("")

# Class of different styles
class style():
    BLACK = '\033[30m'
    RED = '\033[31m'
    GREEN = '\033[32m'
    YELLOW = '\033[33m'
    BLUE = '\033[34m'
    MAGENTA = '\033[35m'
    CYAN = '\033[36m'
    WHITE = '\033[37m'
    UNDERLINE = '\033[4m'
    RESET = '\033[0m'

print(style.YELLOW + "Hello, World!")

Примечание. Windows не полностью поддерживает коды ANSI, будь то системные вызовы или модули. Не все оформление текста поддерживается, и хотя отображаются яркие цвета, они идентичны обычным цветам.

Спасибо @ j-l за поиск еще более короткого метода.

tl; dr : добавить os.system("")

146
SimpleBinary 31 Янв 2021 в 10:19
2
Это работает - я действительно удивлен, что команда цвета включает коды ANSI в терминале Windows, я годами не знал, что это возможно - сама команда не дает никаких подсказок, что она делает это.
 – 
Stuart Axon
3 Июн 2019 в 18:19
4
Большое спасибо за ваш ответ, @SimpleBinary! Поигравшись со своим ответом, я обнаружил, что вы можете еще больше упростить if sys.platform.lower() == "win32": os.system('color'), просто заменив его простым os.system(''). Никаких условий не требуется, и код работает как в Windows 10, так и в Linux (когда я его тестировал). Как видите, вам не нужно делать системный вызов color. Вызовы dir, cd, abcdef и просто пустая строка работают нормально (хотя непустые строки, скорее всего, будут выводить на печать вывод, который вы не хотите видеть).
 – 
J-L
24 Мар 2020 в 20:12
3
Короче говоря, вызов color - не самая важная часть; это сама строка os.system(command), которая делает возможной печать цветов при работе в Windows 10. А «команда» может быть чем угодно - даже просто пустой строкой.
 – 
J-L
24 Мар 2020 в 21:20
3
Это действительно интересно! почему os.system("") заставляет работать цветовые коды?
 – 
Starwarswii
15 Окт 2020 в 09:19
1
Это не реализация python, в C работает printf(fmt, ...); с кодами ASNI в окнах после вызова system(""); (include <stdlib.h>) печатает цветной текст, мне все еще любопытно, почему это так?
 – 
some dev
15 Июн 2021 в 23:56

Вы хотите узнать о escape-последовательностях ANSI. Вот краткий пример:

CSI = "\x1B["
print(CSI+"31;40m" + "Colored Text" + CSI + "0m")

Для получения дополнительной информации см. escape-код ANSI .

Для блочного символа попробуйте использовать Unicode-символ, например \ u2588:

print(u"\u2588")

Собираем все вместе:

print(CSI+"31;40m" + u"\u2588" + CSI + "0m")
108
Peter Mortensen 9 Янв 2021 в 19:39
3
Попробуйте def d(*v): return '\x1B['+';'.join(map(str, v))+'m', затем print ' '.join([d(k,i)+str(i%10)+d(0) for i in range(30,38)+range(40,48) for k in range(2)])
 – 
Evgeni Sergeev
29 Дек 2013 в 14:56
В чем здесь смысл сброса?
 – 
MohitC
26 Дек 2017 в 15:31
Я пробовал это решение. Какова цель "31;40m" и "0m"?
 – 
Qohelet
18 Фев 2021 в 17:28
@Qohelet: вы перешли по ссылке на «escape-код ANSI»? Он объясняет, как работают escape-последовательности ANSI. Первый набор чисел указывает терминалу начать использовать определенный цвет переднего плана и фона, 0m указывает терминалу прекратить использование этого цвета.
 – 
Bryan Oakley
18 Фев 2021 в 18:25
- Интересно, как этого не происходит. Python3.7 печатает его как обычный текст.
 – 
Qohelet
18 Фев 2021 в 18:41

sty похож на colorama, но менее подробен, поддерживает 8-битный и 24-битные (RGB) цвета, поддерживает все эффекты (жирный, подчеркнутый и т. д.) позволяют зарегистрируйте свои собственные стили, полностью типизирован, поддерживает приглушение, действительно гибкий, ну задокументировано и многое другое ...

Примеры:

from sty import fg, bg, ef, rs

foo = fg.red + 'This is red text!' + fg.rs
bar = bg.blue + 'This has a blue background!' + bg.rs
baz = ef.italic + 'This is italic text' + rs.italic
qux = fg(201) + 'This is pink text using 8bit colors' + fg.rs
qui = fg(255, 10, 10) + 'This is red text using 24bit colors.' + fg.rs

# Add custom colors:

from sty import Style, RgbFg

fg.orange = Style(RgbFg(255, 150, 50))

buf = fg.orange + 'Yay, Im orange.' + fg.rs

print(foo, bar, baz, qux, qui, buf, sep='\n')

Печатает :

Enter image description here

<Сильные> Демо:

Enter image description here

94
Rotareti 1 Фев 2021 в 02:46
8
Было бы очень полезно, если бы вы решили сравнить его с colorama, я предпочитаю вашу библиотеку, но только потому, что более короткий api из коробки, и было бы здорово, если бы она была более популярной. Спасибо!
 – 
Victor Gavro
14 Авг 2018 в 15:00
1
Мне нравится стиль, и я пытаюсь отформатировать свою строку с помощью стиля, одна проблема заключается в том, что, когда я печатаю несколько цветов, могу ли я вернуться к предыдущему цвету вместо цвета по умолчанию?
 – 
intijk
24 Июн 2019 в 05:30
Это хорошая идея! Могу добавить сравнение в документацию.
 – 
Rotareti
24 Июн 2019 в 11:40
1
Ваш вопрос действительно не подходит для раздела комментариев. Для такого рода вопросов создайте новый вопрос SO или используйте трекер проблем github.
 – 
Rotareti
24 Июн 2019 в 11:44
: используйте коды fg.rs и bg.rs, чтобы восстановить цвета переднего плана и фона по умолчанию соответственно.
 – 
MRule
28 Май 2021 в 13:32

Rich - это относительно новая библиотека Python для работы с цветом в терминале.

В Rich есть несколько способов работы с цветом. Самый быстрый способ начать - это использовать расширенный метод печати, который отображает синтаксис, подобный BBCode, в Контрольные коды ANSI:

from rich import print
print("[red]Color[/] in the [bold magenta]Terminal[/]!")

Есть и другие способы применения цвета с помощью Rich (регулярное выражение, синтаксис) и связанных функций форматирования.

Screenshot of Rich

69
Peter Mortensen 10 Янв 2021 в 01:53

Мой любимый способ - использовать библиотеку Blessings (полное раскрытие: это я написал). Например:

from blessings import Terminal

t = Terminal()
print t.red('This is red.')
print t.bold_bright_red_on_black('Bright red on black')

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

print t.on_green(' ')

Вы также можете печатать в определенных местах:

with t.location(0, 5):
    print t.on_yellow(' ')

Если в ходе игры вам придется возиться с другими возможностями терминала, вы тоже можете это сделать. Вы можете использовать стандартное форматирование строк Python, чтобы оно было читаемым:

print '{t.clear_eol}You just cleared a {t.bold}whole{t.normal} line!'.format(t=t)

Хорошая вещь в Blessings заключается в том, что он делает все возможное, чтобы работать на всех типах терминалов, а не только на (в большинстве своем) цветных ANSI. Он также сохраняет нечитаемые escape-последовательности из вашего кода, оставаясь при этом кратким для использования. Повеселись!

68
Erik Rose 18 Дек 2011 в 04:32
71
Использование цвета в качестве имени функции, а не параметра - сомнительная практика.
 – 
LtWorf
2 Дек 2012 в 18:48
1
@LtWorf: вы можете легко сделать его параметром, используя getattr, если он вам нужен. Или, что более вероятно, вместо этого просто создайте строку формата динамически.
 – 
jfs
15 Апр 2014 в 17:58
9
Тот факт, что вы можете это сделать, не означает, что вы должны это делать. Это более общий вариант, если цвет - это параметр, который вы можете просто передать.
 – 
LtWorf
30 Сен 2015 в 11:00
3
Вы can just pass функция Python.
 – 
MaxNoe
21 Ноя 2015 в 01:43
2
Обратите внимание, что импорт благословений не работает в Windows, поэтому не используйте его, если ваш скрипт должен быть кроссплатформенным.
 – 
Adversus
26 Апр 2019 в 10:51

Я создал класс со всеми цветами, используя цикл for для перебора всех комбинаций цветов до 100, а затем написал класс с цветами Python. Скопируйте и вставьте, как хотите, GPLv2, сделанную мной:

class colors:
    '''Colors class:
    Reset all colors with colors.reset
    Two subclasses fg for foreground and bg for background.
    Use as colors.subclass.colorname.
    i.e. colors.fg.red or colors.bg.green
    Also, the generic bold, disable, underline, reverse, strikethrough,
    and invisible work with the main class
    i.e. colors.bold
    '''
    reset='\033[0m'
    bold='\033[01m'
    disable='\033[02m'
    underline='\033[04m'
    reverse='\033[07m'
    strikethrough='\033[09m'
    invisible='\033[08m'
    class fg:
        black='\033[30m'
        red='\033[31m'
        green='\033[32m'
        orange='\033[33m'
        blue='\033[34m'
        purple='\033[35m'
        cyan='\033[36m'
        lightgrey='\033[37m'
        darkgrey='\033[90m'
        lightred='\033[91m'
        lightgreen='\033[92m'
        yellow='\033[93m'
        lightblue='\033[94m'
        pink='\033[95m'
        lightcyan='\033[96m'
    class bg:
        black='\033[40m'
        red='\033[41m'
        green='\033[42m'
        orange='\033[43m'
        blue='\033[44m'
        purple='\033[45m'
        cyan='\033[46m'
        lightgrey='\033[47m'
59
Peter Mortensen 3 Янв 2021 в 05:57

Попробуйте этот простой код

def prRed(prt): print("\033[91m {}\033[00m" .format(prt))
def prGreen(prt): print("\033[92m {}\033[00m" .format(prt))
def prYellow(prt): print("\033[93m {}\033[00m" .format(prt))
def prLightPurple(prt): print("\033[94m {}\033[00m" .format(prt))
def prPurple(prt): print("\033[95m {}\033[00m" .format(prt))
def prCyan(prt): print("\033[96m {}\033[00m" .format(prt))
def prLightGray(prt): print("\033[97m {}\033[00m" .format(prt))
def prBlack(prt): print("\033[98m {}\033[00m" .format(prt))

prGreen("Hello, World!")
54
Peter Mortensen 9 Янв 2021 в 21:30
24
Предложение: определите лямбда-выражения, которые возвращают эту цветную строку, вместо того, чтобы печатать их напрямую, чтобы их можно было использовать вместе с другими строками.
 – 
gustafbstrom
23 Янв 2016 в 00:40
Спасибо @gustafbstron. Вот что я решил использовать: def prGreen: return '"\033[91m {}\033[00m" .format(prt), который используется так: print(f'This will turn {prGreen("Hello world")} and change back')
 – 
MACE
17 Авг 2020 в 23:35

У меня есть библиотека под названием colorit. Это очень просто.

Вот некоторые примеры:

from colorit import *

# Use this to ensure that ColorIt will be usable by certain command line interfaces
# Note: This clears the terminal
init_colorit()

# Foreground
print(color("This text is red", Colors.red))
print(color("This text is orange", Colors.orange))
print(color("This text is yellow", Colors.yellow))
print(color("This text is green", Colors.green))
print(color("This text is blue", Colors.blue))
print(color("This text is purple", Colors.purple))
print(color("This text is white", Colors.white))

# Background
print(background("This text has a background that is red", Colors.red))
print(background("This text has a background that is orange", Colors.orange))
print(background("This text has a background that is yellow", Colors.yellow))
print(background("This text has a background that is green", Colors.green))
print(background("This text has a background that is blue", Colors.blue))
print(background("This text has a background that is purple", Colors.purple))
print(background("This text has a background that is white", Colors.white))

# Custom
print(color("This color has a custom grey text color", (150, 150, 150)))
print(background("This color has a custom grey background", (150, 150, 150)))

# Combination
print(
    background(
        color("This text is blue with a white background", Colors.blue), Colors.white
    )
)

# If you are using Windows Command Line, this is so that it doesn't close immediately
input()

Это дает вам:

Picture of ColorIt

Также стоит отметить, что это кроссплатформенный продукт, который был протестирован на Mac, Linux и Windows.

Возможно, вы захотите попробовать: https://github.com/SuperMaZingCoder/colorit

colorit теперь доступен для установки с PyPi! Вы можете установить его с помощью pip install color-it в Windows и pip3 install color-it в macOS и Linux.

43
Peter Mortensen 3 Янв 2021 в 06:12
Когда будет возможность установить с использованием pip?
 – 
ncopiy
14 Июн 2020 в 18:24
Привет! Я действительно планирую сделать это в течение следующих двух дней! : D На данный момент вы можете установить его с помощью инструкций по установке на странице.
 – 
BeastCoder
14 Июн 2020 в 20:51
Теперь его можно установить с помощью pip3 (или pip). Это команда pip3 install color-it или pip install color-it, и ее можно импортировать с помощью import colorit.
 – 
BeastCoder
26 Июл 2020 в 22:58
Я не знаю почему, но мои тексты не раскрашены цветом, указанным в Color.etc ... Все мои тексты превращаются в серые тексты, но с другим тоном (светлее / темнее) ...
 – 
Victor
29 Авг 2020 в 10:14
Хм, если у вас где-то есть инструкция init_colorit(), это может быть ваш терминал. Что он делает в других терминалах?
 – 
BeastCoder
3 Сен 2020 в 18:14

В Windows вы можете использовать модуль win32console (доступен в некоторых дистрибутивах Python) или модуль ctypes (Python 2.5 и выше) для доступа к Win32 API.

Чтобы увидеть полный код, поддерживающий оба способа, см. цветовую консоль. код сообщения из Testoob.

Пример ctypes:

import ctypes

# Constants from the Windows API
STD_OUTPUT_HANDLE = -11
FOREGROUND_RED    = 0x0004 # text color contains red.

def get_csbi_attributes(handle):
    # Based on IPython's winconsole.py, written by Alexander Belchenko
    import struct
    csbi = ctypes.create_string_buffer(22)
    res = ctypes.windll.kernel32.GetConsoleScreenBufferInfo(handle, csbi)
    assert res

    (bufx, bufy, curx, cury, wattr,
    left, top, right, bottom, maxx, maxy) = struct.unpack("hhhhHhhhhhh", csbi.raw)
    return wattr


handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
reset = get_csbi_attributes(handle)

ctypes.windll.kernel32.SetConsoleTextAttribute(handle, FOREGROUND_RED)
print "Cherry on top"
ctypes.windll.kernel32.SetConsoleTextAttribute(handle, reset)
39
orip 8 Сен 2019 в 23:33
3
Честно говоря, это единственное решение, которое работает с окнами. Все остальные ответы - просто копии друг друга.
 – 
Danilo
25 Сен 2019 в 16:07
FWIW, в Windows может быть меньше проблем с использованием ConEmu, который поддерживает последовательности ANSI (помимо множества других преимуществ по сравнению с собственным терминалом). Тем не менее, неплохо иметь собственное решение.
 – 
Endre Both
6 Дек 2019 в 13:04
1
Я с Данилой.
 – 
Sorry IwontTell
7 Май 2020 в 18:18
2
Обратите внимание на этот ответ: stackoverflow.com/a/3332860/12291742
 – 
Ekrem Dinçel
24 Июн 2020 в 17:16

Я заключил ответ Джоэлда в модуль с глобальным функции, которые я могу использовать в любом месте своего кода.

Файл: log.py

def enable():
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = "\033[1m"

def disable():
    HEADER = ''
    OKBLUE = ''
    OKGREEN = ''
    WARNING = ''
    FAIL = ''
    ENDC = ''

def infog(msg):
    print(OKGREEN + msg + ENDC)

def info(msg):
    print(OKBLUE + msg + ENDC)

def warn(msg):
    print(WARNING + msg + ENDC)

def err(msg):
    print(FAIL + msg + ENDC)

enable()

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

import log
log.info("Hello, World!")
log.err("System Error")
37
Peter Mortensen 3 Янв 2021 в 05:55

Это, на мой взгляд, самый простой способ. Пока у вас есть значения RGB желаемого цвета, это должно работать:

def colored(r, g, b, text):
    return "\033[38;2;{};{};{}m{} \033[38;2;255;255;255m".format(r, g, b, text)

Пример печати красного текста:

text = 'Hello, World!'
colored_text = colored(255, 0, 0, text)
print(colored_text)

#or

print(colored(255, 0, 0, 'Hello, World!'))

Разноцветный текст

text = colored(255, 0, 0, 'Hello, ') + colored(0, 255, 0, 'World')
print(text)
33
L D 21 Май 2021 в 06:21
2
На самом деле это правильный ответ на вопрос, и его следует выбрать. Вопрос в том, как печатать цвета в python, а НЕ какие внешние библиотеки можно использовать.
 – 
nosbor
6 Авг 2021 в 13:09
Это напечатало «← [38; 2; 255; 0; 0mbubble ← [38; 2; 255; 255; 255m», когда я создал красную строку «bubble». Это машина W10 ... зависит ли ваше решение от * nix?
 – 
mike rodent
10 Ноя 2021 в 13:29
def black(text):
    print('\033[30m', text, '\033[0m', sep='')

def red(text):
    print('\033[31m', text, '\033[0m', sep='')

def green(text):
    print('\033[32m', text, '\033[0m', sep='')

def yellow(text):
    print('\033[33m', text, '\033[0m', sep='')

def blue(text):
    print('\033[34m', text, '\033[0m', sep='')

def magenta(text):
    print('\033[35m', text, '\033[0m', sep='')

def cyan(text):
    print('\033[36m', text, '\033[0m', sep='')

def gray(text):
    print('\033[90m', text, '\033[0m', sep='')


black("BLACK")
red("RED")
green("GREEN")
yellow("YELLOW")
blue("BLACK")
magenta("MAGENTA")
cyan("CYAN")
gray("GRAY")

Попробуй онлайн

30
Vishal 3 Окт 2019 в 06:59
1
Это только для python3? получил ошибку на sep = '' с python2
 – 
ScipioAfricanus
8 Ноя 2019 в 23:51
1
Это должен быть принятый ответ для python3. Прекрасно работает.
 – 
vfxdev
24 Авг 2020 в 16:35

В Windows нельзя печатать на консоли с цветами, если вы не используете Win32 API.

Для Linux это так же просто, как использовать print с escape-последовательностями, описанными здесь:

Цвета

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

#
25
Peter Mortensen 9 Янв 2021 в 19:32
В Windows 10 цвета работают как в Linux, если вы вызываете os.system('') в начале кода.
 – 
mousetail
3 Окт 2020 в 15:57

Обратите внимание, насколько хорошо ключевое слово with сочетается с подобными модификаторами, которые необходимо сбросить (с использованием Python 3 и Colorama):

from colorama import Fore, Style
import sys

class Highlight:
  def __init__(self, clazz, color):
    self.color = color
    self.clazz = clazz
  def __enter__(self):
    print(self.color, end="")
  def __exit__(self, type, value, traceback):
    if self.clazz == Fore:
      print(Fore.RESET, end="")
    else:
      assert self.clazz == Style
      print(Style.RESET_ALL, end="")
    sys.stdout.flush()

with Highlight(Fore, Fore.GREEN):
  print("this is highlighted")
print("this is not")
22
Peter Mortensen 3 Янв 2021 в 05:54
Пробовал colorama, использовал print(Style.BRIGHT + "Header Test") и print (Style.DIM + word), чтобы создать действительно красивую подсказку.
 – 
Tom
7 Ноя 2013 в 20:02
Это нужно будет изменить, чтобы использовать contextlib для Py3.
 – 
cat
16 Янв 2016 в 00:42
@cat: Для какой версии Python это потребуется?
 – 
Janus Troelsen
16 Янв 2016 в 13:46
Я считаю, что 3 и выше - на нем должен быть декоратор @contextlib.contextmanager, не так ли?
 – 
cat
16 Янв 2016 в 17:41
1
@cat: Почему? Отлично работает без.
 – 
Janus Troelsen
17 Янв 2016 в 15:42

Основываясь на ответе Джоэлда с использованием https://pypi.python.org/pypi/lazyme
pip install -U lazyme:

from lazyme.string import color_print
>>> color_print('abc')
abc
>>> color_print('abc', color='pink')
abc
>>> color_print('abc', color='red')
abc
>>> color_print('abc', color='yellow')
abc
>>> color_print('abc', color='green')
abc
>>> color_print('abc', color='blue', underline=True)
abc
>>> color_print('abc', color='blue', underline=True, bold=True)
abc
>>> color_print('abc', color='pink', underline=True, bold=True)
abc

Снимок экрана:

Enter image description here


Некоторые обновления color_print с новыми средствами форматирования, например:

>>> from lazyme.string import palette, highlighter, formatter
>>> from lazyme.string import color_print
>>> palette.keys() # Available colors.
['pink', 'yellow', 'cyan', 'magenta', 'blue', 'gray', 'default', 'black', 'green', 'white', 'red']
>>> highlighter.keys() # Available highlights.
['blue', 'pink', 'gray', 'black', 'yellow', 'cyan', 'green', 'magenta', 'white', 'red']
>>> formatter.keys() # Available formatter,
['hide', 'bold', 'italic', 'default', 'fast_blinking', 'faint', 'strikethrough', 'underline', 'blinking', 'reverse']

Примечание: italic, fast blinking и strikethrough могут работать не на всех терминалах, и они не работают на Mac и Ubuntu.

Например.,

>>> color_print('foo bar', color='pink', highlight='white')
foo bar
>>> color_print('foo bar', color='pink', highlight='white', reverse=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', bold=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', faint=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', faint=True, reverse=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', underline=True, reverse=True)
foo bar

Снимок экрана:

Enter image description here

22
Peter Mortensen 9 Янв 2021 в 21:38

Вы можете использовать Clint:

from clint.textui import colored
print colored.red('some warning message')
print colored.green('nicely done!')
21
Peter Mortensen 9 Янв 2021 в 20:03
1
Первая ссылка исчезла, поэтому я удалил ее; ссылка GH все еще хороша (хотя проект "заархивирован" и в основном заброшен, насколько я могу судить).
 – 
Giacomo Lacava
23 Авг 2018 в 23:22

Вы можете использовать Python-реализацию библиотеки curses: curses - обработка терминала для отображения символьных ячеек

Кроме того, запустите это, и вы найдете свой ящик:

for i in range(255):
    print i, chr(i)
19
Peter Mortensen 9 Янв 2021 в 19:37
Лично я считаю, что библиотека curses полностью затмилась «благословениями», точно так же, как «запросы» затмили urllib и т. Д.
 – 
Jonathan Hartley
18 Авг 2015 в 14:09

Если вы программируете игру, возможно, вы хотели бы изменить цвет фона и использовать только пробелы? Например:

print " "+ "\033[01;41m" + " " +"\033[01;46m"  + "  " + "\033[01;42m"
15
Andy Hayden 24 Мар 2013 в 21:11
Подробнее об этом можно прочитать здесь: linux.byexamples.com/archives/184/…
 – 
pragmatic
8 Янв 2013 в 16:18

Вот мое современное решение (2021 г.): yachalk

Это одна из немногих библиотек, которая должным образом поддерживает вложенные стили:

enter image description here

Кроме того, yachalk поддерживает автозаполнение, поддерживает 256 цветов, поддерживает определение терминала и полностью типизирован.

Вот некоторые дизайнерские решения, которые вы можете принять во внимание при выборе своего решения.

Библиотеки высокого уровня против библиотек низкого уровня / ручная обработка стилей?

Многие ответы на этот вопрос демонстрируют, как напрямую использовать escape-коды ANSI, или предлагают низкоуровневые библиотеки, которые требуют включения / отключения ручного стиля.

У этих подходов есть тонкие проблемы: вставка стилей включения / выключения вручную

  • более подробный синтаксически, потому что сбросы должны быть указаны явно,
  • больше подвержено ошибкам, потому что вы можете случайно забыть сбросить стиль,
  • не может правильно понять крайние случаи: например, в некоторых терминалах необходимо сбрасывать стили перед новой строкой и повторно активировать их после разрыва строки. Кроме того, некоторые терминалы имеют проблемы с простым переопределением взаимоисключающих стилей и требуют вставки «ненужных» кодов сброса. Если локальный терминал разработчика не имеет этих причуд, разработчик не сразу обнаружит эти причуды. О проблеме будут сообщать только другие люди позже, или она вызовет проблемы, например, на терминалах CI.

Поэтому, если целью является совместимость со многими терминалами, лучше всего использовать высокоуровневую библиотеку, которая предлагает автоматическую обработку сброса стилей. Это позволяет библиотеке позаботиться обо всех крайних случаях, вставляя «ложные» escape-коды ANSI там, где это необходимо.

Зачем нужна еще одна библиотека?

В JavaScript де-факто стандартной библиотекой для этой задачи является chalk, и после ее использования в течение некоторого времени в JS проектов, решений, доступных в мире Python, по сравнению с этим не хватало. Chalk API не только более удобен в использовании (полностью совместим с автозаполнением), но и позволяет правильно использовать все граничные случаи.

Идея yachalk состоит в том, чтобы обеспечить такое же удобство экосистемы Python. Если вас интересует сравнение с другими библиотеками, которые я начал, сравнение функций на странице проектов. Кроме того, вот длинный (но все еще неполный) список альтернатив, которые возникли во время моего исследования - есть из чего выбирать :)

14
bluenote10 1 Сен 2021 в 12:16

Более простой вариант - использовать функцию cprint из termcolor упаковка.

color-print-python

Он также поддерживает формат печати %s, %d:

Enter image description here

Результаты могут зависеть от терминала, поэтому просмотрите раздел Свойства терминала документации пакета.

  • Командная строка Windows и Python IDLE не работают

enter image description here

enter image description here

  • Ноутбук JupyterLab работает

enter image description here

13
Trenton McKinney 18 Сен 2021 в 20:35

Если вы используете Windows, то готово!

# Display text on a Windows console
# Windows XP with Python 2.7 or Python&nbsp;3.2
from ctypes import windll

# Needed for Python2/Python3 diff
try:
    input = raw_input
except:
    pass
STD_OUTPUT_HANDLE = -11
stdout_handle = windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
# Look at the output and select the color you want.
# For instance, hex E is yellow on black.
# Hex 1E is yellow on blue.
# Hex 2E is yellow on green and so on.
for color in range(0, 75):
     windll.kernel32.SetConsoleTextAttribute(stdout_handle, color)
     print("%X --> %s" % (color, "Have a fine day!"))
     input("Press Enter to go on ... ")
11
Peter Mortensen 9 Янв 2021 в 20:05
Если вам нужны разные цвета в одной строке, очищайте поток стандартного вывода между вызовами: print("%X --> %s" % (color, "Have a fine day!"), end='', flush=True)
 – 
user2023861
14 Фев 2019 в 17:22

Вот пример проклятия:

import curses

def main(stdscr):
    stdscr.clear()
    if curses.has_colors():
        for i in xrange(1, curses.COLORS):
            curses.init_pair(i, i, curses.COLOR_BLACK)
            stdscr.addstr("COLOR %d! " % i, curses.color_pair(i))
            stdscr.addstr("BOLD! ", curses.color_pair(i) | curses.A_BOLD)
            stdscr.addstr("STANDOUT! ", curses.color_pair(i) | curses.A_STANDOUT)
            stdscr.addstr("UNDERLINE! ", curses.color_pair(i) | curses.A_UNDERLINE)
            stdscr.addstr("BLINK! ", curses.color_pair(i) | curses.A_BLINK)
            stdscr.addstr("DIM! ", curses.color_pair(i) | curses.A_DIM)
            stdscr.addstr("REVERSE! ", curses.color_pair(i) | curses.A_REVERSE)
    stdscr.refresh()
    stdscr.getch()

if __name__ == '__main__':
    print "init..."
    curses.wrapper(main)
10
nosklo 13 Авг 2009 в 16:05

https://raw.github.com/fabric/fabric/master/fabric/colors.py

"""
.. versionadded:: 0.9.2

Functions for wrapping strings in ANSI color codes.

Each function within this module returns the input string ``text``, wrapped
with ANSI color codes for the appropriate color.

For example, to print some text as green on supporting terminals::

    from fabric.colors import green

    print(green("This text is green!"))

Because these functions simply return modified strings, you can nest them::

    from fabric.colors import red, green

    print(red("This sentence is red, except for " + \
          green("these words, which are green") + "."))

If ``bold`` is set to ``True``, the ANSI flag for bolding will be flipped on
for that particular invocation, which usually shows up as a bold or brighter
version of the original color on most terminals.
"""


def _wrap_with(code):

    def inner(text, bold=False):
        c = code
        if bold:
            c = "1;%s" % c
        return "\033[%sm%s\033[0m" % (c, text)
    return inner

red = _wrap_with('31')
green = _wrap_with('32')
yellow = _wrap_with('33')
blue = _wrap_with('34')
magenta = _wrap_with('35')
cyan = _wrap_with('36')
white = _wrap_with('37')
10
Vishal 27 Мар 2013 в 01:15

asciimatics предоставляет переносимую поддержку для создания текстового пользовательского интерфейса и анимации:

#!/usr/bin/env python
from asciimatics.effects import RandomNoise  # $ pip install asciimatics
from asciimatics.renderers import SpeechBubble, Rainbow
from asciimatics.scene import Scene
from asciimatics.screen import Screen
from asciimatics.exceptions import ResizeScreenError


def demo(screen):
    render = Rainbow(screen, SpeechBubble('Rainbow'))
    effects = [RandomNoise(screen, signal=render)]
    screen.play([Scene(effects, -1)], stop_on_resize=True)

while True:
    try:
        Screen.wrapper(demo)
        break
    except ResizeScreenError:
        pass

Asciicast:

rainbow-colored text among ascii noise

10
jfs 5 Май 2016 в 16:08

Определите строку, с которой начинается цвет, и строку, заканчивающую цвет. Затем распечатайте текст, указав начальную строку впереди и конечную строку в конце.

CRED = '\033[91m'
CEND = '\033[0m'
print(CRED + "Error, does not compute!" + CEND)

Это дает следующее в Bash, в urxvt с цветовой схемой в стиле Zenburn:

Output colors

Экспериментируя, мы можем получить больше цветов:

Color matrix

Примечание: \33[5m и \33[6m мигают.

Таким образом мы можем создать полноцветную коллекцию:

CEND      = '\33[0m'
CBOLD     = '\33[1m'
CITALIC   = '\33[3m'
CURL      = '\33[4m'
CBLINK    = '\33[5m'
CBLINK2   = '\33[6m'
CSELECTED = '\33[7m'

CBLACK  = '\33[30m'
CRED    = '\33[31m'
CGREEN  = '\33[32m'
CYELLOW = '\33[33m'
CBLUE   = '\33[34m'
CVIOLET = '\33[35m'
CBEIGE  = '\33[36m'
CWHITE  = '\33[37m'

CBLACKBG  = '\33[40m'
CREDBG    = '\33[41m'
CGREENBG  = '\33[42m'
CYELLOWBG = '\33[43m'
CBLUEBG   = '\33[44m'
CVIOLETBG = '\33[45m'
CBEIGEBG  = '\33[46m'
CWHITEBG  = '\33[47m'

CGREY    = '\33[90m'
CRED2    = '\33[91m'
CGREEN2  = '\33[92m'
CYELLOW2 = '\33[93m'
CBLUE2   = '\33[94m'
CVIOLET2 = '\33[95m'
CBEIGE2  = '\33[96m'
CWHITE2  = '\33[97m'

CGREYBG    = '\33[100m'
CREDBG2    = '\33[101m'
CGREENBG2  = '\33[102m'
CYELLOWBG2 = '\33[103m'
CBLUEBG2   = '\33[104m'
CVIOLETBG2 = '\33[105m'
CBEIGEBG2  = '\33[106m'
CWHITEBG2  = '\33[107m'

Вот код для генерации теста:

x = 0
for i in range(24):
  colors = ""
  for j in range(5):
    code = str(x+j)
    colors = colors + "\33[" + code + "m\\33[" + code + "m\033[0m "
  print(colors)
  x = x + 5
267
Peter Mortensen 9 Янв 2021 в 21:34
2
Какая оболочка или терминал заставляет его мигать?
 – 
Zypps987
7 Июн 2017 в 15:57
2
(u) rxvt например
 – 
qubodup
12 Июн 2017 в 11:56
К вашему сведению. То, что помечено как «бежевый» выше, является светло-голубым на Терминале Apple (а также во многих других списках названий цветов для Python). Кроме того, некоторые из двойных цветов являются светлой / темной версиями, а белые варианты я бы назвал белым и серым ...
 – 
uliwitness
24 Мар 2021 в 14:25
2
\33[25m также должно означать "Не мигает", без сброса других стилей - en.wikipedia.org/wiki/…
 – 
Roland Pihlakas
16 Авг 2021 в 01:12
# Pure Python 3.x demo, 256 colors
# Works with bash under Linux and MacOS

fg = lambda text, color: "\33[38;5;" + str(color) + "m" + text + "\33[0m"
bg = lambda text, color: "\33[48;5;" + str(color) + "m" + text + "\33[0m"

def print_six(row, format, end="\n"):
    for col in range(6):
        color = row*6 + col - 2
        if color>=0:
            text = "{:3d}".format(color)
            print (format(text,color), end=" ")
        else:
            print(end="    ")   # four spaces
    print(end=end)

for row in range(0, 43):
    print_six(row, fg, " ")
    print_six(row, bg)

# Simple usage: print(fg("text", 160))

Text with altering foreground and background, colors 0..141 Text with altering foreground and background, colors 142..255

Попробуйте онлайн

40
Andriy Makukha 10 Июл 2020 в 01:34
Форматирование очень хорошее, и у него много цветовой гаммы. Я все время возвращаюсь к этому, спасибо!
 – 
Shane Smiskol
1 Авг 2020 в 16:44
Очень мило, не могли бы вы дать мне какое-нибудь объяснение насчет "\33[38;5;" .
 – 
Jay
8 Авг 2020 в 15:47
1
@Jay, это escape-последовательность. '\33' - это escape-символ (в восьмеричном формате).
 – 
Andriy Makukha
8 Авг 2020 в 20:59
Отличное решение на чистом питоне.
 – 
n1c9
18 Сен 2020 в 01:05

В конце концов, я сделал это, и я почувствовал, что это самое чистое:

formatters = {
    'RED': '\033[91m',
    'GREEN': '\033[92m',
    'END': '\033[0m',
}

print 'Master is currently {RED}red{END}!'.format(**formatters)
print 'Help make master {GREEN}green{END} again!'.format(**formatters)
25
Peter Mortensen 9 Янв 2021 в 21:32
Это действительно хорошо, если вы делаете это без стороннего пакета.
 – 
Jamie Counsell
20 Мар 2017 в 22:53

Глупо просто, основываясь на ответе Джоэлда:

class PrintInColor:
    RED = '\033[91m'
    GREEN = '\033[92m'
    YELLOW = '\033[93m'
    LIGHT_PURPLE = '\033[94m'
    PURPLE = '\033[95m'
    END = '\033[0m'

    @classmethod
    def red(cls, s, **kwargs):
        print(cls.RED + s + cls.END, **kwargs)

    @classmethod
    def green(cls, s, **kwargs):
        print(cls.GREEN + s + cls.END, **kwargs)

    @classmethod
    def yellow(cls, s, **kwargs):
        print(cls.YELLOW + s + cls.END, **kwargs)

    @classmethod
    def lightPurple(cls, s, **kwargs):
        print(cls.LIGHT_PURPLE + s + cls.END, **kwargs)

    @classmethod
    def purple(cls, s, **kwargs):
        print(cls.PURPLE + s + cls.END, **kwargs)

Тогда просто

PrintInColor.red('hello', end=' ')
PrintInColor.green('world')
24
Peter Mortensen 9 Янв 2021 в 21:20
2
Это приведет к сбою, если вы передадите более одного позиционного аргумента или что-то еще, кроме строкового типа.
 – 
Romain Vincent
19 Мар 2018 в 05:49
Тогда не передавайте более одного позиционного аргумента или чего-либо другого, кроме строки ty - подождите, это print - замены ? Возражение отклонено.
 – 
wizzwizz4
17 Мар 2019 в 23:56
1
Я не совсем понимаю, что вы имели в виду под этим комментарием, я все равно не вижу в этом смысла. Если вы собираетесь предложить класс ... для замены такого простого метода, как print, вы также можете не делать его так легко разрушаемым. Только мое мнение.
 – 
Romain Vincent
18 Мар 2019 в 11:18
1
Я собирался сказать, что ваше возражение было ошибочным, но для замены такой универсальной функции, как print, нужно убедиться, что правильно воспроизведена ее функциональность.
 – 
wizzwizz4
18 Мар 2019 в 23:10
1
Реализации для использования бесконечных аргументов: def purple(cls, *args, **kwargs): print(cls.PURPLE, *args, cls.END, **kwargs)
 – 
Emilien Baudet
9 Ноя 2019 в 15:51

УРА! Другая версия

Хотя я считаю этот ответ полезным, я немного его изменил. Этот GitHub Gist является результатом

Применение

print colors.draw("i'm yellow", bold=True, fg_yellow=True)

Enter image description here

Кроме того, вы можете обернуть распространенные обычаи:

print colors.error('sorry, ')

Asd

https://gist.github.com/Jossef/0ee20314577925b4027f

11
Peter Mortensen 9 Янв 2021 в 20:15