Как распечатать цветной текст на терминале?

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

Вы должны указать дополнительную информацию, чтобы получить лучший ответ: мультиплатформенность? принимаются внешние модули?

sorin 26.08.2009 22:40

IPython делает это, кроссплатформенный. Посмотрите, что они используют?

endolith 25.01.2010 06:41

Этот символ мог бы стать отличным цветным блоком: Единственная проблема в том, что он является расширенным ASCII, возможно, вы могли бы заставить его работать, используя http://stackoverflow.com/questions/8465226/using-extended-as‌​cii-codes-with-pytho‌​n

Samy Bencherif 05.10.2013 20:14

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

ayke 20.11.2013 00:02

Этот ответ пришел довольно поздно, но мне он кажется лучшим ... те, кто проголосовал выше, требуют специальных хаков для Windows, тогда как этот просто работает: stackoverflow.com/a/3332860/901641

ArtOfWarfare 16.12.2013 20:59

запустите pip install ipython и добавьте alias python = "ipython" в сценарий запуска оболочки (например, ~/.bashrc для оболочки bash)

Alexandre Holden Daly 14.07.2014 19:24

Как насчет stackoverflow.com/a/42528796/610569 с использованием pypi.python.org/pypi/lazyme? (отказ от ответственности: бесстыдная пробка)

alvas 01.03.2017 13:12

все эти ответы портят форматирование текста. Беспорядок можно увидеть, запустив python <yourscript>.py |cat -A

P.... 26.09.2019 18:59

Если вы не хотите устанавливать дополнительный пакет, следуйте этому новый ответ.

Benyamin Jafari 24.03.2021 14:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2 428
9
1 534 020
51

Ответы 51

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

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

Цвета

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

#

В Windows 10 цвета работают как в Linux, если вы вызываете os.system('') в начале кода.

mousetail 03.10.2020 15:57

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

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

for i in range(255):
    print i, chr(i)

Лично я считаю, что библиотека curses полностью затмилась «благословениями», точно так же, как «запросы» затмили urllib и т. д.

Jonathan Hartley 18.08.2015 14:09

Вы хотите узнать о 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")

Попробуйте 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.12.2013 14:56

в чем здесь смысл сброса?

MohitC 26.12.2017 15:31

Я пробовал это решение. Какова цель "31;40m" и "0m"?

Qohelet 18.02.2021 17:28

@Qohelet: вы перешли по ссылке на «escape-код ANSI»? Он объясняет, как работают escape-последовательности ANSI. Первый набор чисел указывает терминалу начать использовать определенный цвет переднего плана и фона, 0m сообщает терминалу, чтобы он прекратил использовать этот цвет.

Bryan Oakley 18.02.2021 18:25

@BryanOakley - Интересно, этого не происходит. Python3.7 печатает его как обычный текст.

Qohelet 18.02.2021 18:41

Вы запускаете его в окне терминала, которое поддерживает escape-последовательности ANSI?

Bryan Oakley 18.02.2021 18:52

Это в некоторой степени зависит от того, на какой платформе вы находитесь. Наиболее распространенный способ сделать это - распечатать 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 (при условии, что вы используете АНСИКОН, или в Windows 10, если вы включили Эмуляция VT100). Существуют коды ANSI для установки цвета, перемещения курсора и т. д.

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

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

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

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

Но предположим, что мое приглашение по умолчанию не черное - как вы думаете, возможно ли восстановить python после этих уловок?

Adobe 01.08.2012 13:04

Еще один полезный - UNDERLINE = '\033[4m'. Что произойдет, если ansi.sys отключен в Windows и вы попытаетесь использовать эти escape-последовательности ANSI?

Dennis 01.10.2012 23:57

В Linux вы можете захотеть использовать tput, вот так, поскольку это приводит к более переносимому коду.

Martin Ueding 03.11.2012 15:04

@Cawas: Реальный вариант использования disable - это передача вывода в файл; Хотя такие инструменты, как cat, могут поддерживать цвета, обычно лучше не печатать информацию о цвете в файлах.

Sebastian Mach 09.04.2014 10:27

@phresnel Я вижу ... Если да, то я считаю, что в этом ответе его даже не следует упоминать, поскольку это только сбивает с толку его объективность. Даже если это был вариант использования Стивен Оксли (из предыдущего комментария, посвященного той же проблеме), это все равно то же самое. Может, мне стоит предложить поправку.

cregox 11.04.2014 12:17

@joeld можно ли делать варианты одного цвета?

Ethan Bierlein 17.04.2014 03:08

В чем разница между \ 033 [и \ x1b [? Кажется, они делают то же самое

user393267 04.07.2015 06:54

Просто замечу: модуль Python Curses также доступен в Python 3 docs.python.org/3/howto/curses.html

mike 15.07.2015 01:57

Замечу: в Windows 10 нет необходимости включать ansi.sys, потому что терминал распознает escape-символы.

Alexander Simko 28.02.2016 16:18

Не выкидывайте коды терминалов, не проверив значение $TERM! Лучше использовать стандартную библиотеку termcap, чтобы ссылаться на них по имени ...

Toby Speight 01.03.2016 21:28

Попробуйте этот фрагмент, чтобы увидеть все цвета и стили, поддерживаемые вашей системой: print(''.join(['\033[' + str(x) + 'mfoo' for x in range(0,150)]) +'\033[0m')

Samy Bencherif 03.06.2016 08:59

@AlexanderSimko, я не совсем понимаю, что вы имеете в виду под ansi.sys. Это был драйвер MS-DOS. Возможно, вы имеете в виду ANSICON, который перехватывает и взламывает API консоли Windows. Консоль Windows 10 изначально поддерживает эмуляцию VT100, но ее необходимо включить. Если вы запускаете Python через cmd.exe, он включен, но это не по умолчанию для новых консолей, таких как запуск py.exe или python.exe, щелкнув скрипт.

Eryk Sun 02.09.2016 02:37

@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 02.09.2016 02:38

@newbiez Нет никакой разницы, оба дают один и тот же символ ESC (то есть символ # 27 в таблице ASCII). 33 и 1B - это просто восьмеричное и шестнадцатеричное представление десятичного числа 27.

balu 08.10.2017 12:23

Всем, кто использует пример кода Python из ответа: следует отметить, что цвета в диапазоне 90-97 и 100-107 - это нестандартный, и, действительно, на моем терминале они не все дают цвета, указанные в именах переменных. . Лучше использовать стандартные диапазоны 30-37 и 40-47. Источник: en.wikipedia.org/wiki/…

balu 08.10.2017 12:27

Поэтому, когда я запускаю сценарий python с print('\033[94mfoo') в моем терминале, весь текст в моем терминале после этого становится синим ... Как мне предотвратить это?

Joren 11.01.2018 00:13

@Joren Вам нужно поставить курсор на \033[0m. В приведенном выше примере добавляется bcolors.ENDC после ранее инициированного цвета.

Noel 21.01.2018 12:13

добавление 1; также сделает его жирным. Как \033[1;Xm (где X - цветовой код)

user2763554 02.07.2019 09:51

А как совместить ЖИРНЫЙ и ЦВЕТНОЙ шрифт? print(f'{bcolors.OKBLUE}{bcolors.BOLD}Test{bcolors.ENDC}') будет отображаться синим цветом, но не жирным шрифтом.

BayesianMonk 06.10.2020 13:56

хорошая ссылка о том, как работают цвета терминов: jafrog.com/2013/11/23/colors-in-terminal.html

Mike Pennington 14.10.2020 14:02

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

print " "+ "\033[01;41m" + " " +"\033[01;46m"  + "  " + "\033[01;42m"

Подробнее об этом можно прочитать здесь- linux.byexamples.com/archives/184/…

pragmatic 08.01.2013 16:18

Для персонажей

Ваш терминал, скорее всего, использует символы Unicode (обычно в кодировке UTF-8), поэтому для просмотра вашего любимого символа достаточно выбрать подходящий шрифт. Unicode char U + 2588, я бы посоветовал вам использовать «Полный блок».

Попробуйте следующее:

import unicodedata
fp= open("character_list", "w")
for index in xrange(65536):
    char= unichr(index)
    try: its_name= unicodedata.name(char)
    except ValueError: its_name= "N/A"
    fp.write("%05d %04x %s %s\n" % (index, index, char.encode("UTF-8"), its_name)
fp.close()

Позже просмотрите файл в любимой программе просмотра.

Для цветов

проклятия - это модуль, который вы хотите использовать. Отметьте это руководство.

В 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)

Честно говоря, это единственное решение, которое работает с окнами. Все остальные ответы - просто копии друг друга.

Danilo 25.09.2019 16:07

FWIW, в Windows может быть меньше проблем с использованием ConEmu, который поддерживает последовательности ANSI (помимо множества других преимуществ по сравнению с собственным терминалом). Тем не менее, неплохо иметь собственное решение.

Endre Both 06.12.2019 13:04

Я с Данилой.

Sorry IwontTell 07.05.2020 18:18

@Danilo, обратите внимание на этот ответ: stackoverflow.com/a/3332860/12291742

Ekrem Dinçel 24.06.2020 17:16

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

from termcolor import colored

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

Или в Python 3:

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

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

Поскольку он выдает коды ANSI, работает ли он в Windows (консоли DOS), если загружен файл ansi.sys? support.microsoft.com/kb/101875

Phil P 29.07.2011 08:16

Только что заметил, что по состоянию на 13.01.2011 он теперь под лицензией MIT.

Alexander Tsepkov 28.10.2011 06:19

не имеет юнит-тестов (в отличие от colorama) и не обновляется с 2011 г.

Janus Troelsen 20.07.2013 23:28

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

ereOn 26.02.2015 20:53
Версия 1.1.0 добавил функцию cprint(): cprint('Hello, World!', 'green', 'on_red').
dtk 29.06.2015 01:04
termcolor.COLORS дает вам список цветов
akxlr 14.11.2015 05:05

Привет, Самат! Было бы неплохо упомянуть, что вы все еще можете использовать .format() для добавления переменных к напечатанной строке, например: print(colored('{0}', 'red').format(var_with_msg)). Хорошее решение! Tks

ivanleoncz 17.10.2018 01:50

В Windows сначала запустите os.system('color'), затем начнут работать escape-последовательности ANSI.

Szabolcs 12.12.2018 19:53

@Szabolcs Вы должны обнаружить, что вам это не нужно в новом терминале Windows 10, который поддерживает их изначально.

wizzwizz4 17.03.2019 23:48

В Linux: pip install python-termcolor

Yan King Yin 11.10.2020 06:00

Действительно, os.system('color') работают, более того, даже os.system('') работают хорошо. очень странный

sakiM 28.12.2020 05:39

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

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)

Ваш код не работает под Windows (x64) с этой ошибкой: AttributeError: объект 'module' не имеет атрибута 'wrapper'

sorin 25.08.2009 20:51

@Sorin Sbarnea: Согласно официальной документации python curses в docs.python.org/library/curses.html, модуль curses не поддерживается в Windows. Возможно, вы получили эту ошибку вместо «Нет такого модуля» или что-то в этом роде, потому что вы, вероятно, назвали свой тестовый файл «curses.py», поэтому он импортирует сам себя.

nosklo 25.08.2009 23:12

Ответ - Колорама для всей кроссплатформенной раскраски в Python.

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

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

Пример снимка экрана: example screenshot

Как автор Colorama, спасибо за упоминание @ nbv4. Я попытаюсь немного уточнить: Colorama стремится позволить программам Python печатать цветной текст терминала на всех платформах, используя те же коды ANSI, что описаны во многих других ответах на этой странице. В Windows Colorama удаляет эти символы ANSI из стандартного вывода и преобразует их в эквивалентные вызовы win32 для цветного текста. На других платформах Colorama ничего не делает. Следовательно, вы можете использовать коды ANSI или модули, такие как Termcolor, а с Colorama они «просто работают» на всех платформах. Во всяком случае, это идея?

Jonathan Hartley 13.09.2010 17:22

@Jonathan, это действительно классная библиотека! Возможность кросс-платформенного вывода цвета на Python действительно хороша и полезна. Я предоставляю инструменты для библиотеки, которая раскрашивает собственную консоль. Я могу перенаправить вывод этой консоли на терминал и раскрасить вывод. Теперь я могу даже увеличить библиотеку и позволить пользователю выбирать цвета. Это позволит дальтоникам настроить работу так, чтобы они действительно могли правильно видеть результат. Спасибо

Demolishun 30.11.2012 17:05

Это должно быть в стандартной библиотеке ... Думаю, кроссплатформенная поддержка цветов важна.

daviewales 28.06.2013 18:08

Колорама великолепна! Также обратите внимание на ответная разметка, который построен на colorama и позволяет использовать простую разметку на основе тегов (например, <b>bold</b>) для добавления стиля к тексту терминала.

gvalkov 19.02.2017 20:07
Colorama поставляется с Anaconda, а termcolor, предложенный в ответе выше, - нет. Это сделало Colorama очень предпочтительным для многих пользователей Python.
Anonymous 10.02.2018 05:48

Это не работает без вызова colorama.init (). Проголосуйте!

Smit Johnth 19.02.2018 06:32

@SmitJohnth только в Windows.

Michael Leonard 15.04.2018 22:38

@MichaelLeonard, этот ответ должен быть кроссплатформенным, верно?

Smit Johnth 16.04.2018 22:26

Если вы используете консоль Pycharm, вызов init () в Windows вместо этого деактивирует цвета, поскольку он уже интерпретирует коды ANSI и игнорирует коды win32.

Leogout 28.04.2018 16:28

@SmitJohnth, да что бы сделать кросс-платформенный ответ, который неоспоримо хорошо. Но говорить, что код не работает без вызова init (), тоже неверно, он отлично работает в системах Unixy и без него.

Michael Leonard 01.05.2018 20:58

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

gcharbon 12.06.2018 15:22

Работает ли Colorama с дампами JSON, @JonathanHartley?

mazunki 20.03.2019 21:21

@mazunki Основная цель Colorama - разрешить существующим цветовым кодам ANSI в потоке работать в Windows. Или он также позволяет автору программы Python явно добавлять свои собственные цветовые коды в то, что они печатают (но на самом деле, вместо этого используйте благословения). Colorama не автоматически «раскрашивает» такие вещи, как дампы JSON. Для этого используйте что-нибудь вроде `pygmentize '(от Pygments).

Jonathan Hartley 20.03.2019 22:55

Как вы предлагаете смешать их обоих вместе?

mazunki 20.03.2019 22:59

Бьюсь об заклад, вы можете использовать «пигменты» для добавления цветов к некоторым json из программы python. Затем в той же программе вызовите import colorama и вызовите colorama.init(), чтобы при выводе результата на стандартный вывод он работал как в Windows, так и где-либо еще.

Jonathan Hartley 07.05.2019 23:49

@gvalkov спасибо за подсказку, люблю свою маленькую библиотеку. Выделение одним лайнером четкое и лаконичное: ansiprint(f'<bg white><blue>{h}</blue></bg white>'.join(s.split(h)))

Nathan Chappell 07.07.2020 14:12

Как было предложено @SmitJohnth, вы должны запустить эту строку кода, чтобы работать с приведенным выше фрагментом кода, colorama.init ()

Abdul Haseeb 04.10.2020 10:06

Я написал простой модуль, доступный по адресу: http://pypi.python.org/pypi/colorconsole

Он работает с Windows, Mac OS X и Linux. Он использует ANSI для Linux и Mac, но нативные вызовы консольных функций в Windows. У вас есть цвета, положение курсора и ввод с клавиатуры. Это не замена проклятиям, но может быть очень полезным, если вам нужно использовать в простых скриптах или играх ASCII.

Мой любимый способ - с библиотекой Благословения (полное раскрытие: я ее написал). Например:

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-последовательности из вашего кода, оставаясь при этом кратким для использования. Веселиться!

Использование цвета в качестве имени функции, а не параметра - сомнительная практика.

LtWorf 02.12.2012 18:48

@LtWorf: вы можете легко сделать его параметром, используя getattr, если вам это нужно. Или, что более вероятно, вместо этого просто создайте строку формата динамически.

jfs 15.04.2014 17:58

@LtWorf: почему? Функции и методы Python - первоклассные граждане

mike3996 30.09.2015 09:29

@progo тот факт, что вы можете это сделать, не означает, что вы должны это делать. Это более общий вариант, если цвет - это параметр, который вы можете просто передать.

LtWorf 30.09.2015 11:00

Вы can just pass функция python.

MaxNoe 21.11.2015 01:43

Обратите внимание, что импорт благословений не работает в Windows, поэтому не используйте его, если ваш скрипт должен быть кроссплатформенным.

Adversus 26.04.2019 10:51

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

from clint.textui import colored
print colored.red('some warning message')
print colored.green('nicely done!')

Первая ссылка исчезла, поэтому я удалил ее; ссылка GH все еще хороша (хотя проект "заархивирован" и в основном заброшен, насколько я могу судить).

Giacomo Lacava 23.08.2018 23:22

Чтобы решить эту проблему, я создал невероятно простой пакет для печати строк с интерполированными цветовыми кодами, названный icolor.

icolor включает в себя две функции: cformat и cprint, каждая из которых принимает строку с подстроками, которые интерполируются для сопоставления с escape-последовательностями ANSI, например.

from icolor import cformat # there is also cprint

cformat("This is #RED;a red string, partially with a #xBLUE;blue background")
'This is \x1b[31ma red string, partially with a \x1b[44mblue background\x1b[0m'

Включены все цвета ANSI (например, #RED;, #BLUE; и т. д.), А также #RESET;, #BOLD; и другие.

Цвета фона имеют префикс x, поэтому зеленый фон будет #xGREEN;.

От # можно избавиться с помощью ##.

Учитывая его простоту, вероятно, лучшая документация - это сам код.

Это на PYPI, так что можно sudo easy_install icolor.

Если вы используете 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 ... ")

Если вам нужны разные цвета в одной строке, очищайте поток стандартного вывода между вызовами: print("%X --> %s" % (color, "Have a fine day!"), end='', flush=True)

user2023861 14.02.2019 17:22

Обратите внимание, насколько хорошо ключевое слово 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")

Пробовал colorama, использовал print(Style.BRIGHT + "Header Test") и print (Style.DIM + word), чтобы создать действительно красивую подсказку.

Tom 07.11.2013 20:02

Это нужно будет изменить, чтобы использовать contextlib для Py3.

cat 16.01.2016 00:42

@cat: Для какой версии Python это понадобится?

Janus Troelsen 16.01.2016 13:46

Я считаю, что 3 и выше - на нем должен быть декоратор @contextlib.contextmanager, не так ли?

cat 16.01.2016 17:41

@cat: Почему? Отлично работает без.

Janus Troelsen 17.01.2016 15:42

@cat Это не необходимый; @contextlib.contextmanager - это сокращение для упрощения создания менеджеров контекста, но вы все равно можете использовать менеджеры контекста обычный.

wizzwizz4 18.03.2019 00:00

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')

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

Файл: 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")

Мои два цента (PyColorTerm):

Установка:

sudo apt-get install python-pip
pip install pycolorterm

Скрипт Python:

from pycolorterm import pycolorterm

with pycolorterm.pretty_output(pycolorterm.FG_GREEN) as out:
    out.write('Works OK!')

"работает нормально!" отображается зеленым цветом.

Распечатайте строку, с которой начинается цвет / стиль, затем строку, а затем завершите изменение цвета / стиля с помощью '\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

это работает в большинстве оболочек, а также в ipython, что достаточно для большинства приложений.

dashesy 18.02.2014 10:13

могу я спросить, что это за терминал?

FlipTack 03.12.2016 20:53

насколько это портативно?

Ruggero Turra 12.01.2017 00:17

Краткая автономная реализация: gist.github.com/Sheljohn/68ca3be74139f66dbc6127784f638920

Jonathan H 07.03.2017 18:34

@Flip Это будет работать в любом терминале / консоли, поддерживающей escape-последовательности ANSI.

wjandrea 05.08.2020 18:12

Чтобы это работало в Windows 10 Powershell, в Python import os выполните os.system ('color'). С этого момента escape-последовательности ANSI будут работать волшебным образом.

DoomGoober 23.09.2020 02:52

Напоминание: коды, начинающиеся с цифр 5 или 6, мигают. например 5;37;41 или 6;37;41, а последнее число может достигать> = 48, что соответствует полностью белому фону.

NegaOverflow 22.03.2021 13:08

Я создал класс со всеми цветами, используя цикл 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'

Я написал модуль, который обрабатывает цвета в Linux, OS X и Windows. Он поддерживает все 16 цветов на всех платформах, вы можете устанавливать цвета переднего плана и фона в разное время, а строковые объекты дают нормальные результаты для таких вещей, как len () и .capitalize ().

https://github.com/Robpol86/colorclass

Example on Windows cmd.exe

Вы можете использовать escape-символы оболочки, которые доступны на любом языке. Эти escape-символы начинаются с символа ESC, за которым следует ряд аргументов.

Например, чтобы вывести в терминал красную строку "Привет мир!":

echo "\e[31m Hello, World! \e[0m"

Или из скрипта Python:

print("\e[31m Hello world \e[0m")

Кроме того, я написал статью о Последовательности выхода, которая, вероятно, поможет вам лучше понять этот механизм.

У Python нет escape-последовательности \e. Просто потому, что реализации немногоecho поддерживают, он не делает эти последовательности общедоступными.

Martijn Pieters 05.11.2017 15:16

И \e не является частью спецификации POSIX для echo, поэтому и там он не универсален. Версия GNU coreutils поддерживает его, но не используется в OS X (вариант BSD). И последнее, но не менее важное: последовательность тоже не функция оболочки, она специфична для команды echo.

Martijn Pieters 05.11.2017 15:29

См. Этот вопрос stackoverflow.com/questions/47121421/…, который привел к этим комментариям.

rnso 05.11.2017 16:33

Используйте пижонство. Это простой способ сделать цвет в терминале!

Пример:

print(pyfancy.RED + "Hello Red" + pyfancy.END)

Не очень красивый код, в нем даже есть ссылка на pythonw.exe;)

Floyd 09.04.2015 21:22

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

Хотя я считаю этот ответ полезным, я немного его изменил. Это 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

Тупо просто, на основе ответ Джоэлда:

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')

Это приведет к сбою, если вы передадите более одного позиционного аргумента или что-либо, кроме строкового типа.

Romain Vincent 19.03.2018 05:49

@RomainVincent Тогда не передавайте более одного позиционного аргумента или чего-либо другого, кроме строки ty - подождите, это print-замены? Возражение отклонено.

wizzwizz4 17.03.2019 23:56

@ wizzwizz4 Я не совсем понимаю, что вы имели в виду в этом комментарии, я все равно не вижу в этом смысла. Если вы собираетесь предложить класс ... для замены такого простого метода, как print, вы также можете не делать его так легко разрушаемым. Только мое мнение.

Romain Vincent 18.03.2019 11:18

@RomainVincent Я собирался сказать, что ваше возражение было неправильным, но для замены такой универсальной функции, как print, нужно убедиться, что правильно воспроизведена ее функциональность.

wizzwizz4 18.03.2019 23:10

@RomainVincent Реализует использование бесконечных аргументов: <code> def purple(cls, *args, **kwargs): print(cls.PURPLE, *args, cls.END, **kwargs) </code>

Emilien Baudet 09.11.2019 15:51

Если вы используете Джанго:

>>> from django.utils.termcolors import colorize
>>> print colorize("Hello, World!", fg = "blue", bg='red',
...                 opts=('bold', 'blink', 'underscore',))
Hello World!
>>> help(colorize)

Снимок:

Image

(Обычно я использую цветной вывод для отладки на терминале сервера запуска, поэтому добавил его.)

You can test if it is installed in your machine: $ python -c "import django; print django.VERSION". To install it, check: How to install Django

Дайте ему пытаться !!

Еще один модуль PyPI, который обертывает функцию Python 3 Распечатать:

https://pypi.python.org/pypi/colorprint

Его можно использовать в Python 2.x, если вы также используете from __future__ import print. Вот пример Python 2 со страницы модулей PyPI:

from __future__ import print_function
from colorprint import *

print('Hello', 'world', color='blue', end='', sep=', ')
print('!', color='red', format=['bold', 'blink'])

Он выводит "Hello, world!" со словами, выделенными синим цветом, и мигающим красным жирным шрифтом восклицательного знака.

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

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!")

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

gustafbstrom 23.01.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.08.2020 23:35

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

#!/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

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

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)

Это действительно хорошо, если вы делаете это без стороннего пакета.

Jamie Counsell 20.03.2017 22:53

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

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

как ты заставил текст мигать

WiLL_K 07.05.2017 21:21

Какая оболочка или терминал заставляет его мигать?

Zypps987 07.06.2017 15:57

(u) rxvt например

qubodup 12.06.2017 11:56

Мигающий текст работает очень хорошо. Но как мне это остановить? Все последовательные отпечатки по какой-то причине мигают. Мой терминал думает, что пришло время вечеринки!

captain 29.11.2017 22:30

В конце строки, которая будет мигать, поместите выше \33[0m или CEND.

Sam Bernstein 20.02.2018 02:01

К вашему сведению. То, что обозначено «бежевым» выше, на Терминале Apple (а также во многих других списках названий цветов для Python) имеет светло-голубой цвет. Кроме того, некоторые из двойных цветов являются светлой / темной версиями, а белые варианты я бы назвал белым и серым ...

uliwitness 24.03.2021 14:25

Основываясь на ответ Джоэлда, используя 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

свинарник похож на 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

Было бы очень полезно, если бы вы решили сравнить его с colorama, я предпочитаю вашу библиотеку, но только потому, что более короткий api из коробки, и было бы здорово, если бы она была более популярной. Спасибо!

Victor Gavro 14.08.2018 15:00

Мне нравится стиль, и я пытаюсь отформатировать свою строку с помощью стиля, одна проблема заключается в том, что, когда я печатаю несколько цветов, могу ли я вернуться к предыдущему цвету вместо цвета по умолчанию?

intijk 24.06.2019 05:30

@VictorGavro Это хорошая идея! Могу добавить сравнение в документацию.

Rotareti 24.06.2019 11:40

@intijk Ваш вопрос действительно не подходит для раздела комментариев. Для такого рода вопросов создайте новый вопрос SO или используйте трекер проблем github.

Rotareti 24.06.2019 11:44
# 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..141Text with altering foreground and background, colors 142..255

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

Форматирование очень хорошее, и у него много цветовой гаммы. Я все время возвращаюсь к этому, спасибо!

Shane Smiskol 01.08.2020 16:44

очень хорошо, не могли бы вы дать мне какое-нибудь объяснение по поводу "\33[38;5;" .

Jay 08.08.2020 15:47

@ Джей, это escape-последовательность. '\33' - это escape-символ (в восьмеричном формате).

Andriy Makukha 08.08.2020 20:59

Отличное решение на чистом питоне.

n1c9 18.09.2020 01:05

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

color-print-python

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

Enter image description here

Я новичок в Python, и я взволнован каждый раз, когда открываю для себя такие темы, как эта. Но на этот раз (внезапно) я чувствую, что мне есть что сказать. Тем более, что несколько минут назад я обнаружил в Python вещь Вау (по крайней мере, сейчас для меня):

Менеджеры контекста

from contextlib import contextmanager
# FORECOLOR
BLACKFC,REDFC,GREENFC,YELLOWFC,BLUEFC = '38;30m','38;31m','38;32m','38;33m','38;34m'
# BACKGOUND
BLACKBG,REDBG,GREENBG,YELLOWBG,BLUEBG = '48;40m','48;41m','48;42m','48;43m','48;44m'

@contextmanager
def printESC(prefix, color, text):
  print("{prefix}{color}{text}".format(prefix=prefix, color=color, text=text), end='')
  yield
  print("{prefix}0m".format(prefix=prefix))

with printESC('\x1B[', REDFC, 'Colored Text'):
  pass

Пример

Или просто так:

# FORECOLOR
BLACKFC,REDFC,GREENFC,YELLOWFC,BLUEFC = '38;30m','38;31m','38;32m','38;33m','38;34m'
# BACKGOUND
BLACKBG,REDBG,GREENBG,YELLOWBG,BLUEBG = '48;40m','48;41m','48;42m','48;43m','48;44m'

def printESC(prefix, color, text):
  print("{prefix}{color}{text}".format(prefix=prefix, color=color, text=text), end='')
  print("{prefix}0m".format(prefix=prefix))

printESC('\x1B[', REDFC, 'Colored Text')

Вот решение, которое изначально работает в 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("")

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

Stuart Axon 03.06.2019 18:19

@anaksunaman Это будет работать во всех операционных системах, которые уже поддерживают цветной текст, а также поддерживают Windows 10.

SimpleBinary 12.01.2020 04:20

@MaxDoesStuff Правда? Какую версию Python вы используете? Также какая версия MacOS?

SimpleBinary 02.03.2020 23:57

@Nikos Извините, я забыл сказать, что он работает только в Windows 10.

SimpleBinary 03.03.2020 00:00

Большое спасибо за ваш ответ, @SimpleBinary! Поигравшись с вашим ответом, я обнаружил, что вы можете еще больше упростить if sys.platform.lower() == "win32": os.system('color'), просто заменив его только os.system(''). Никаких условий не требуется, и код работает как в Windows 10, так и в Linux (когда я его тестировал). Как видите, вам не нужно делать системный вызов color. Вызовы dir, cd, abcdef и просто пустая строка работают нормально (хотя непустые строки, скорее всего, напечатают вывод, который вы не хотите видеть).

J-L 24.03.2020 20:12

Короче говоря, вызов color - не самая важная часть; именно строка os.system(command) делает возможной печать цветов при работе в Windows 10. И «команда» может быть чем угодно - даже пустой строкой.

J-L 24.03.2020 21:20

это действительно интересно! почему os.system("") вызывает работу цветовых кодов?

Starwarswii 15.10.2020 09:19

@Starwarswii Кажется, что любой системный вызов работает. Понятия не имею почему. Если узнаю, выложу сюда.

SimpleBinary 17.10.2020 10:19
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")

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

Это только для python3? получил ошибку на sep = '' с python2

ScipioAfricanus 08.11.2019 23:51

Это должен быть принятый ответ для python3. Прекрасно работает.

vfxdev 24.08.2020 16:35

Самый простой способ, который я могу найти, - это не использовать escape-коды ANSI, а использовать Fore из модуля импорта colorama. Взгляните на код ниже:

from colorama import Fore, Style

print(Fore.MAGENTA + "IZZ MAGENTA BRUH.")

print(Style.RESET_ALL + "IZZ BACK TO NORMALZ.")

по сравнению с escape-кодом ANSI:

print("\u001b[31m IZZ RED (NO MAGENTA ON ANSI CODES).\u001b[0m")

print("BACK TO NORMALZ.")

У меня есть библиотека под названием 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.

когда будет возможность установить с использованием pip?

ncopiy 14.06.2020 18:24

@ncopiy Привет! Я действительно планирую сделать это в течение следующих двух дней! : D На данный момент вы можете установить его с помощью инструкций по установке на странице.

BeastCoder 14.06.2020 20:51

@ncopiy Теперь он доступен для установки с pip3 (или pip). Это команда pip3 install color-it или pip install color-it, ее можно импортировать с помощью import colorit.

BeastCoder 26.07.2020 22:58

Я не знаю почему, но мои тексты не раскрашены цветом, указанным в Color.etc ... Все мои тексты превращаются в серые тексты, но с другим тоном (светлее / темнее) ...

Victor 29.08.2020 10:14

@Victor Хм, если у вас где-то есть инструкция init_colorit(), это может быть ваш терминал. Что он делает в других терминалах?

BeastCoder 03.09.2020 18:14

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

BeastCoder 04.09.2020 22:49

@Victor Хорошо, если вам все еще интересно, я исправил проблему, она была связана с тем, как я инициализировал colorit, в итоге я вернулся к тому, как я это делал, и удалил метод инициализации colorama.

BeastCoder 12.09.2020 17:18

@BeastCoder Он вообще не работает => i.imgur.com/qGqMnxs.jpg У меня возникла та же проблема, о которой я говорил ранее. Я использую библиотеку click, чтобы иметь возможность успешно раскрашивать свои тексты.

Victor 13.09.2020 20:46

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

def print_in_color(txt_msg, fore_tuple, back_tuple, ):
    # Prints the text_msg in the foreground color specified by fore_tuple with the background specified by back_tuple
    # text_msg is the text, fore_tuple is foreground color tuple (r,g,b), back_tuple is background tuple (r,g,b)
    rf,bf,gf = fore_tuple
    rb,gb,bb = back_tuple
    msg = '{0}' + txt_msg
    mat = '\33[38;2;' + str(rf) + ';' + str(gf) + ';' + str(bf) + ';48;2;' + str(rb) + ';' +str(gb) + ';' + str(bb) + 'm'
    print(msg .format(mat))
    print('\33[0m') # Returns default print color to back to black

# Example of use using a message with variables
fore_color = 'cyan'
back_color = 'dark green'
msg = 'foreground color is {0} and the background color is {1}'.format(fore_color, back_color)
print_in_color(msg, (0,255,255), (0,127,127))

Я предлагаю эту новую библиотеку Printy. Они только что выпустили версию 1.2.0 как кроссплатформенную библиотеку.

Проверить это: Распечатать на GitHub

Он основан на флагах, поэтому вы можете делать такие вещи, как

from printy import printy

# With global flags, this will apply a bold (B) red (r) color and an underline (U) to the whole text
printy("Hello, World!", "rBU")

# With inline formats, this will apply a dim (D)
#blue (b) to the word 'Hello' and a stroken (S)
#yellow (y) to the word 'world', and the rest will remain as the predefined format
printy("this is a [bD]Hello@ [yS]world@ text")

Enter image description here

Это, на мой взгляд, самый простой способ. Пока у вас есть значения 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)

Я создал проект (console-color) и уже опубликовал его в PyPI.

Можно кинуть pip install console-color для установки.

И я пишу документ с помощью Sphinx-read-the-doc, см. здесь.

Вы можете получить больше примеров из Google-Colab.

Я все еще публикую пример, чтобы привлечь пользователя, щелкнув по указанной выше ссылке:

# cprint is something like below
# cprint(text: str, fore: T_RGB = None, bg: T_RGB = None, style: Style = '')
# where T_RGB = Union[Tuple[int, int, int], str] for example. You can input (255, 0, 0) or '#ff0000' or 'ff0000'. They are OK.
# The Style you can input the ``Style.`` (the IDE will help you to choose what you wanted)

# from console_color import RGB, Fore, Style, cprint, create_print
from console_color import *

cprint("Hello, World!", RGB.RED, RGB.YELLOW, Style.BOLD+Style.URL+Style.STRIKE)
cprint("Hello, World!", fore=(255, 0, 0), bg = "ffff00", style=Style.BOLD+Style.URL+Style.STRIKE)

Enter image description here

Конечно, необязательно вводить все параметры. Вы можете просто добавить нужные атрибуты.


Если честно, то в этом проекте нет ничего особенного. Он просто использует f"\033[{target};2;{r};{g};{b}m{text}{style}" где цель - 38 или 48, текст - ваша строка ввода, а стиль - '\ 33 [0m', '\ 33 [1m' ... '\ 033 [9m'. Какие-то вещи.

И я просто делаю его простым в использовании (по крайней мере, для меня).

import click

click.secho('Hello, World!', fg='green')
click.secho('Some more text', bg='blue', fg='white')
click.secho('ATTENTION', blink=True, bold=True)

click (библиотека CLI) имеет очень удобный способ сделать это, и его все равно стоит подумать, если вы пишете инструмент командной строки.

Отлично, у меня это сработало! Решение color-it не сработало для меня, потому что мои тексты не были раскрашены цветом, указанным в Color.etc ... Все мои тексты превращались в серые тексты, но с другим тоном (светлее / темнее)

Victor 29.08.2020 10:16

Эмодзи

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

Но вместо этого вы можете использовать смайлики! например, вы можете использовать ⚠️ для предупреждений и ? для сообщений об ошибках.

Или просто используйте эти записные книжки как цветные:

?: error message
?: warning message
?: ok status message
?: action message
?: canceled status message
?: Or anything you like and want to recognize immediately by color

? Бонус:

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

But some operating systems (including some Linux distributions in some version with some window managers) default emoji font is not colorful by default and you may want to make them colorful, first.

Об этом не спрашивали, но я рад, что вы поделились этим, несмотря ни на что! Я действительно предпочитаю это цвету текста.

smassey 04.10.2020 18:23

Linux? Какой дистрибутив, версия и оконный менеджер? Ubuntu 20.04 (Фокальная ямка)?

Peter Mortensen 09.01.2021 23:56

Ответ обновлен для большей точности. Спасибо за внимание @PeterMortensen

Mojtaba Hosseini 10.01.2021 00:16

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

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

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

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

Screenshot of Rich

Некоторые из решений, например:

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)

print(fg("text", 160))

ИЛИ ЖЕ

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)

ИЛИ ЖЕ

class Color:
    COLOR = [f"\33[{i}m" for i in range(44)]

for i in range(44):
    print(Color.COLOR[i] + 'text')

может не работать в терминалах Windows 10 или Windows PowerShell или в других случаях, когда они могут не работать напрямую.

Но при вставке могут помочь эти две маленькие строчки в начале программы:

import os
os.system('')

os.system('') позволяет печатать коды ANSI в Терминале, которые окрашивают ваш вывод в соответствии с вашим выбором (но могут быть и другие системные функции, которые вам может потребоваться вызвать, чтобы иметь возможность печатать цветной текст в терминале).

print("\033[1;32;40m Bright Green  \n")

1

Объяснение было бы в порядке.

Peter Mortensen 10.01.2021 01:54

Если вы хотите использовать только встроенные пакеты, следуйте этой структуре:

Фактически, я улучшил ответ Мохамед Сами, который теперь отвечает за несколько входов, а также за числа. Кроме того, он поддерживает другие аргументы print(), такие как end=. Кроме того, я добавил метод .store() для записи журналов в файл.

Вы можете создать утилиту, чтобы использовать ее в любом месте вашего кода:

# utility.py

from datetime import datetime

class ColoredPrint:
    def __init__(self):
        self.PINK = '\033[95m'
        self.OKBLUE = '\033[94m'
        self.OKGREEN = '\033[92m'
        self.WARNING = '\033[93m'
        self.FAIL = '\033[91m'
        self.ENDC = '\033[0m'

    def disable(self):
        self.PINK = ''
        self.OKBLUE = ''
        self.OKGREEN = ''
        self.WARNING = ''
        self.FAIL = ''
        self.ENDC = ''

    def store(self):
        date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        with open('logfile.log', mode='a') as file_:
            file_.write(f"{self.msg} -- {date}")
            file_.write("\n")

    def success(self, *args, **kwargs):
        self.msg = ' '.join(map(str, args))
        print(self.OKGREEN + self.msg + self.ENDC, **kwargs)
        return self

    def info(self, *args, **kwargs):
        self.msg = ' '.join(map(str, args))
        print(self.OKBLUE + self.msg + self.ENDC, **kwargs)
        return self

    def warn(self, *args, **kwargs):
        self.msg = ' '.join(map(str, args))
        print(self.WARNING + self.msg + self.ENDC, **kwargs)
        return self

    def err(self, *args, **kwargs):
        self.msg = ' '.join(map(str, args))
        print(self.FAIL + self.msg + self.ENDC, **kwargs)
        return self

    def pink(self, *args, **kwargs):
        self.msg = ' '.join(map(str, args))
        print(self.PINK + self.msg + self.ENDC, **kwargs)
        return self

например

from utility import ColoredPrint

log = ColoredPrint()

log.success("Hello" , 123, "Bye").store()
log.info("Hello" , 123, "Bye")
log.warn("Hello" , 123, "Bye")
log.err("Hello" , 123, "Bye").store()
log.pink("Hello" , 123, "Bye")

Из:

Другие вопросы по теме