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

avatar
aboSamoor
13 ноября 2008 в 18:58
1651012
56
2556

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

Источник
sorin
26 августа 2009 в 18:40
10

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

endolith
25 января 2010 в 03:41
3

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

Samy Bencherif
5 октября 2013 в 16:14
0

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

ayke
19 ноября 2013 в 20:02
0

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

ArtOfWarfare
16 декабря 2013 в 16:59
6

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

Alexandre Holden Daly
14 июля 2014 в 15:24
0

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

alvas
1 марта 2017 в 10:12
0

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

P....
26 сентября 2019 в 15:59
0

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

Benyamin Jafari
24 марта 2021 в 11:41
0

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

Ответы (56)

avatar
Vinod Srivastav
5 января 2022 в 21:14
4

В windows 10 вы можете попробовать этот крошечный скрипт, который работает как микшер цветов со значениями от 0 до 255 для красного, зеленого и синего:

import os

os.system('')


def RGB(red=None, green=None, blue=None,bg=False):
    if(bg==False and red!=None and green!=None and blue!=None):
        return f'\u001b[38;2;{red};{green};{blue}m'
    elif(bg==True and red!=None and green!=None and blue!=None):
        return f'\u001b[48;2;{red};{green};{blue}m'
    elif(red==None and green==None and blue==None):
        return '\u001b[0m'

и вызовите функцию RGB, чтобы сделать любую комбинацию цветов как:

g0 = RGB()
g1 = RGB(0,255,0)
g2 = RGB(0,100,0,True)+""+RGB(100,255,100)
g3 = RGB(0,255,0,True)+""+RGB(0,50,0)

print(f"{g1}green1{g0}")
print(f"{g2}green2{g0}")
print(f"{g3}green3{g0}")

RGB() без параметров очистит и установит цвет переднего плана/фона на по умолчанию. Если вам нужен черный, вы должны называть его RGB(0,0,0), а для белый RGB(255,255,255). В то время как RGB(0,255,0) создает абсолютно-зеленый RGB(150,255,150) создает светло-зеленый.

Это поддерживает Фон и передний план , чтобы установить цвет как Фоновый цвет .

Например: для установки RED Как Фоновый цвет его следует назвать RGB(255,0,0,True) Но выбирать <93633333232332332336333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333611936119361119323 33 > просто назовите его как RGB(255,0,0,False), так как bg по умолчанию False это упрощает вызов его как RGB(255,0,0)

alexzander
8 января 2022 в 16:01
1

все имейте в виду, что это цвета terminal independent, а это означает, что если вам нужен зеленый цвет, отличный от TERM 256 colors вашего терминала, его going to work

avatar
Sylvester Kruin
3 сентября 2021 в 20:30
2

Для этого вы можете использовать модуль pygments. Например:

from pygments import console
print(pygments.console.colorize("red", "This text is red."))

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

avatar
ToTamire
11 августа 2021 в 20:02
0

Google переместил меня туда, когда я искал, как раскрашивать журналы так:

цветные журналы

Установка

pip install coloredlogs

Использование

Минимальное использование:
import logging
import coloredlogs

coloredlogs.install()  # install a handler on the root logger

logging.debug('message with level debug')
logging.info('message with level info')
logging.warning('message with level warning')
logging.error('message with level error')
logging.critical('message with level critical')

Результаты с: minimal usage

Начать с отладки на уровне сообщения:
import logging
import coloredlogs

coloredlogs.install(level='DEBUG')  # install a handler on the root logger with level debug

logging.debug('message with level debug')
logging.info('message with level info')
logging.warning('message with level warning')
logging.error('message with level error')
logging.critical('message with level critical')

Результаты с: debug level

Скрыть сообщения из библиотек:
import logging
import coloredlogs

logger = logging.getLogger(__name__)  # get a specific logger object
coloredlogs.install(level='DEBUG')  # install a handler on the root logger with level debug
coloredlogs.install(level='DEBUG', logger=logger)  # pass a specific logger object

logging.debug('message with level debug')
logging.info('message with level info')
logging.warning('message with level warning')
logging.error('message with level error')
logging.critical('message with level critical')

Результаты с: debug level

Форматировать сообщения журнала:
import logging
import coloredlogs

logger = logging.getLogger(__name__)  # get a specific logger object
coloredlogs.install(level='DEBUG')  # install a handler on the root logger with level debug
coloredlogs.install(level='DEBUG', logger=logger)  # pass a specific logger object
coloredlogs.install(
    level='DEBUG', logger=logger,
    fmt='%(asctime)s.%(msecs)03d %(filename)s:%(lineno)d %(levelname)s %(message)s'
)

logging.debug('message with level debug')
logging.info('message with level info')
logging.warning('message with level warning')
logging.error('message with level error')
logging.critical('message with level critical')

Результаты с: format log messages

Доступные атрибуты формата:
  • %(asctime)s - Время в виде удобочитаемой строки, когда был выполнен вызов журнала
  • %(created)f - Время в виде числа с плавающей запятой при выдаче вызова журнала
  • %(filename)s - Имя файла
  • %(funcName)s - Имя функции, содержащей вызов журнала
  • %(hostname)s - Имя хоста системы
  • %(levelname)s - Уровень записи текста
  • %(levelno)s - Целочисленный уровень ведения журнала
  • %(lineno)d - номер линии, по которой поступил вызов журнала
  • %(message)s - сообщение передано вызову журнала (то же, что и %(msg)s)
  • %(module)s - имя файла без расширения, в котором был выполнен вызов журнала
  • %(msecs)d - Миллисекундная часть времени, когда был выдан вызов регистрации
  • %(msg)s - сообщение передано вызову журнала (то же, что и %(message)s)
  • %(name)s - Имя регистратора
  • %(pathname)s - полный путь к файлу, содержащему вызов журнала
  • %(process)d - Идентификатор процесса
  • %(processName)s - Имя процесса
  • %(programname)s - системное имя программы
  • %(relativeCreated)d - Время как целое число в миллисекундах, когда был инициирован вызов регистрации, относительно времени, когда модуль регистрации был загружен
  • %(thread)d - ID потока
  • %(threadName)s - Имя потока
  • %(username)s - системное имя пользователя

Источники:

Пакет цветных журналов

Библиотека журналов

avatar
bluenote10
18 июля 2021 в 11:18
2

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

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

enter image description here

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

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

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

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

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

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

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

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

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

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

avatar
Life is complex
25 июня 2021 в 14:46
0

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

В этом ответе также используется библиотека Python Rich, которая была кратко рассмотрена в предыдущем ответе на этот вопрос. В этом ответе я использую функцию rich.color.ANSI_COLOR_NAMES , чтобы получить случайный список цветов, которые будут использоваться для выделения предопределенных условий поиска.

import random
import re as regex
from rich import color
from rich import print


def create_dynamic_regex(search_words):
    """
    This function is used to create a dynamic regular expression
    string and a list of random colors. Both these elements will
    be used in the function colorize_text()

    :param search_words: list of search terms
    :return: regular expression search string and a list of colors
    :rtype: string, list
    """
    colors_required = create_list_of_colors(len(search_words))
    number_of_search_words = len(search_words)
    combined_string = ''
    for search_word in search_words:
        number_of_search_words -= 1
        if number_of_search_words != 0:
            current_string = ''.join(r'(\b' + search_word + r'\b)|')
            combined_string = (combined_string + current_string)
        elif number_of_search_words == 0:
            current_string = ''.join(r'(\b' + search_word + r'\b)')
            combined_string = (combined_string + current_string)
    return combined_string, colors_required


def random_color():
    """
    This function is used to create a random color using the
    Python package rich.
    :return: color name
    :rtype: string
    """
    selected_color = random.choice(list(color.ANSI_COLOR_NAMES.keys()))
    return selected_color


def create_list_of_colors(number_of_colors):
    """
    This function is used to generate a list of colors,
    which will be used in the function colorize_text()
    :param number_of_colors:
    :return: list of colors
    :rtype: list
    """
    list_of_colors = [random_color() for _ in range(number_of_colors)]
    return list_of_colors


def colorize_text(text, regex_string, array_of_colors):
    """
    This function is used to colorize specific words in a text string.
    :param text: text string potentially containing specific words to colorize.
    :param regex_string: regular expression search string
    :param array_of_colors: list of colors
    :return: colorized text
    :rtype: string
    """
    available_colors = array_of_colors
    word_regex = regex.compile(f"{regex_string}", regex.IGNORECASE)
    i = 0
    output = ""
    for word in word_regex.finditer(text):
        get_color = available_colors[word.lastindex - 1]
        output += "".join([text[i:word.start()],
                           "[%s]" % available_colors[word.lastindex - 1],
                           text[word.start():word.end()], "[/%s]" % available_colors[word.lastindex - 1]])
        i = word.end()
    return ''.join([output, text[word.end():]])


def generate_console_output(text_to_search, words_to_find):
    """
    This function is used generate colorized text that will
    be outputting to the console.

    :param text_to_search: text string potentially containing specific words to colorize.
    :param words_to_find: list of search terms.
    :return: A string containing colorized words.
    :rtype: string
    """
    search_terms, colors = create_dynamic_regex(words_to_find)
    colorize_html = colorize_text(text_to_search, search_terms, colors)
    print(colorize_html)


text = "The dog chased the cat that was looking for the mouse that the dog was playing with."
words = ['dog', 'cat', 'mouse']
generate_console_output(text, words)

Вот результат печати из приведенного выше кода:

enter image description here

Я создал два GIST для раскрашивания текста.

avatar
Benyamin Jafari
24 марта 2021 в 11:40
9

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

На самом деле, я улучшил ответ Мохамеда Сами, который теперь отвечает за несколько вводов, а также за числа. Кроме того, он поддерживает другие аргументы 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")

Вышел:

enter image description here


[ОБНОВЛЕНИЕ]:

Теперь доступен его пакет PyPI ????:

pip install python-colored-print
avatar
Proud
28 декабря 2020 в 09:40
2
print("\033[1;32;40m Bright Green  \n")

1

Peter Mortensen
9 января 2021 в 22:54
1

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

avatar
prerakl123
10 декабря 2020 в 16:58
1

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

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 в Терминале, которые окрашивают ваш вывод в соответствии с вашим выбором (но могут быть и другие системные функции, которые вам может потребоваться вызвать, чтобы иметь возможность печатать цветной текст в терминале).

avatar
Will McGugan
1 декабря 2020 в 10:16
60

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

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

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

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

Screenshot of Rich

avatar
Mojtaba Hosseini
28 сентября 2020 в 09:58
10

Emoji

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

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

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

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

???? Бонус:

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

Но в некоторых операционных системах (включая некоторые дистрибутивы Linux в некоторых версиях с некоторыми оконными менеджерами) шрифт эмодзи по умолчанию не является цветным по умолчанию, и вы можете сначала сделать их цветными.

smassey
4 октября 2020 в 15:23
1

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

Peter Mortensen
9 января 2021 в 20:56
0

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

Mojtaba Hosseini
9 января 2021 в 21:16
0

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

avatar
ijoseph
23 августа 2020 в 20:15
9
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) имеет очень удобный способ сделать это, и в любом случае стоит подумать, если вы пишете инструмент командной строки.

Victor
29 августа 2020 в 07:16
1

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

avatar
Carson
23 июня 2020 в 08:24
6

Я создал проект (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'. Какие-то вещи.

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

avatar
L D
22 мая 2020 в 17:46
20

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

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

avatar
Edgardo Obregón
15 апреля 2020 в 00:56
7

Я предлагаю эту новую библиотеку 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

avatar
Gerry P
16 февраля 2020 в 18:54
3

Вот простая функция, которую я использую для печати текстового сообщения в цвете без запоминания кодов 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))
avatar
BeastCoder
3 января 2020 в 16:43
42

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

ncopiy
14 июня 2020 в 15:24
0

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

BeastCoder
14 июня 2020 в 17:51
0

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

BeastCoder
26 июля 2020 в 19:58
0

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

Victor
29 августа 2020 в 07:14
0

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

BeastCoder
3 сентября 2020 в 15:14
0

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

BeastCoder
4 сентября 2020 в 19:49
0

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

BeastCoder
12 сентября 2020 в 14:18
0

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

Victor
13 сентября 2020 в 17:46
0

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

avatar
Reinstate C0MMUNiSM
10 декабря 2019 в 19:29
4

Самый простой способ, который я могу найти, - это не использовать 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.")
avatar
Vishal
28 сентября 2019 в 18:15
28
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")

Попробуйте в Интернете

ScipioAfricanus
8 ноября 2019 в 20:51
1

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

vfxdev
24 августа 2020 в 13:35
1

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

avatar
SimpleBinary
2 марта 2019 в 03:59
136

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

Stuart Axon
3 июня 2019 в 15:19
2

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

SimpleBinary
12 января 2020 в 01:20
0

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

SimpleBinary
2 марта 2020 в 20:57
0

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

SimpleBinary
2 марта 2020 в 21:00
0

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

J-L
24 марта 2020 в 17:12
4

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

J-L
24 марта 2020 в 18:20
3

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

Starwarswii
15 октября 2020 в 06:19
3

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

SimpleBinary
17 октября 2020 в 07:19
0

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

some dev
15 июня 2021 в 20:56
1

@Starwarswii Это не реализация python, в C работает printf(fmt, ...); с кодами ASNI в окнах после вызова system(""); (include <stdlib.h>) печатает цветной текст, мне все еще любопытно, почему это?

avatar
Al Po
27 августа 2018 в 04:35
3

Я новичок в 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')
avatar
kmario23
21 мая 2018 в 10:59
12

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

color-print-python

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

Enter image description here

avatar
Andriy Makukha
25 апреля 2018 в 14:50
39
# 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

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

Shane Smiskol
1 августа 2020 в 13:44
0

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

Jay
8 августа 2020 в 12:47
0

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

Andriy Makukha
8 августа 2020 в 17:59
1

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

n1c9
17 сентября 2020 в 22:05
0

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

avatar
Rotareti
10 февраля 2018 в 17:04
89
Victor Gavro
14 августа 2018 в 12:00
8

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

intijk
24 июня 2019 в 02:30
1

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

Rotareti
24 июня 2019 в 08:40
0

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

Rotareti
24 июня 2019 в 08:44
1

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

MRule
28 мая 2021 в 10:32
0

@intijk: используйте коды fg.rs и bg.rs, чтобы сбросить цвета переднего плана и фона на значения по умолчанию соответственно.

avatar
alvas
1 марта 2017 в 10:09
22

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

avatar
qubodup
12 сентября 2016 в 14:00
252

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

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
7 мая 2017 в 18:21
2

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

Zypps987
7 июня 2017 в 12:57
2

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

qubodup
12 июня 2017 в 08:56
2

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

captain
29 ноября 2017 в 19:30
10

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

Sam Bernstein
19 февраля 2018 в 23:01
5

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

avatar
Ben174
17 августа 2016 в 20:01
24

В итоге я сделал это, и я чувствовал, что это было наиболее чисто:

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 марта 2017 в 19:53
0

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

avatar
jfs
5 мая 2016 в 13:08
10

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

avatar
dayitv89
23 декабря 2015 в 20:20
52

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

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
22 января 2016 в 21:40
23

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

MACE
17 августа 2020 в 20:35
0

Спасибо @gustafbstron. Вот что я решил использовать: def prGreen: return '"\033[91m {}\033[00m" .format(prt), который используется так: print(f'This will turn {prGreen("Hello world")} and change back')

avatar
drevicko
9 июля 2015 в 06:58
10

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

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

Выводится «Привет, мир!» со словами синего цвета и мигающим красным жирным шрифтом восклицательного знака.

avatar
Grijesh Chauhan
22 апреля 2015 в 19:00
11

Если вы используете Django:

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

Снимок:

Image

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

Вы можете проверить, установлен ли он на вашем компьютере: $ python -c "import django; print django.VERSION". Чтобы установить его, проверьте: Как установить Django

Попробуйте попробуйте !!

avatar
zahanm
18 апреля 2015 в 22:18
24

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

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 марта 2018 в 02:49
2

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

wizzwizz4
17 марта 2019 в 20:56
0

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

Romain Vincent
18 марта 2019 в 08:18
1

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

wizzwizz4
18 марта 2019 в 20:10
1

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

Emilien Baudet
9 ноября 2019 в 12:51
1

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

avatar
Jossef Harush
7 февраля 2015 в 22:43
11

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

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

avatar
WebMaster
26 января 2015 в 21:50
5

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

Пример:

print(pyfancy.RED + "Hello Red" + pyfancy.END)
Floyd
9 апреля 2015 в 18:22
1

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

avatar
Igor Šarčević
1 декабря 2014 в 17:35
3

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

Например, для вывода красной «Hello, World!» строки в вашем терминале:

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

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

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

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

Martijn Pieters♦
5 ноября 2017 в 12:16
0

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

Martijn Pieters♦
5 ноября 2017 в 12:29
0

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

rnso
5 ноября 2017 в 13:33
0

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

avatar
Robpol86
2 ноября 2014 в 01:44
4

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

https://github.com/Robpol86/colorclass

Example on Windows cmd.exe

avatar
GI Jack
18 октября 2014 в 23:26
59

Я создал класс со всеми цветами, используя цикл 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'
avatar
rabin utam
14 февраля 2014 в 17:56
518

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

dashesy
18 февраля 2014 в 06:13
9

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

FlipTack
3 декабря 2016 в 17:53
4

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

Ruggero Turra
11 января 2017 в 21:17
4

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

Jonathan H
7 марта 2017 в 15:34
3

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

wjandrea
5 августа 2020 в 15:12
0

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

DoomGoober
22 сентября 2020 в 23:52
0

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

NegaOverflow
22 марта 2021 в 10:08
0

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

avatar
Diego Navarro
20 сентября 2013 в 18:06
1

Мои два цента (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!')

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

avatar
Mohamed Samy
12 июня 2013 в 11:38
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")
avatar
Vishal
26 марта 2013 в 21:15
10

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')
avatar
Janus Troelsen
1 июля 2012 в 00:41
21

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

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

cat
15 января 2016 в 21:42
0

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

Janus Troelsen
16 января 2016 в 10:46
0

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

cat
16 января 2016 в 14:41
0

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

Janus Troelsen
17 января 2016 в 12:42
1

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

avatar
Navweb
25 июня 2012 в 16:59
11

Если вы используете 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 ... ")
user2023861
14 февраля 2019 в 14:22
0

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

avatar
Brian M. Hunt
24 июня 2012 в 15:07
2

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

avatar
Giacomo Lacava
8 января 2012 в 01:40
21

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

from clint.textui import colored
print colored.red('some warning message')
print colored.green('nicely done!')
Giacomo Lacava
23 августа 2018 в 20:22
1

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

avatar
Erik Rose
18 декабря 2011 в 00:32
65

Мой любимый способ - использовать библиотеку 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-последовательности из вашего кода, оставаясь при этом кратким для использования. Удачи!

LtWorf
2 декабря 2012 в 14:48
68

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

jfs
15 апреля 2014 в 13:58
1

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

mike3996
30 сентября 2015 в 06:29
0

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

LtWorf
30 сентября 2015 в 08:00
8

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

MaxNoe
20 ноября 2015 в 22:43
3

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

Adversus
26 апреля 2019 в 07:51
2

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

bluenote10
29 мая 2021 в 17:32
0

@LtWorf Я не согласен. (1) Случаи использования цвета в качестве значения довольно редки. Типичные варианты использования - это просто использование определенного цвета, а автозаполнение имеет большую практическую пользу. (2) В языке, который поддерживает функции как первоклассные сущности, наличие Fore.GREEN или t.on_green эквивалентно, т.е. все еще можно передавать цвета. Посмотрите, как это делает chalk, лучшая библиотека, которую я когда-либо использовал для цветов.

LtWorf
30 мая 2021 в 20:36
0

@ bluenote10 прошло 10 лет с момента этого комментария. Отпусти ситуацию…

bluenote10
30 мая 2021 в 21:49
0

@LtWorf: Прошу прощения, если мой комментарий прозвучал резко! Я просто хотел предложить альтернативный взгляд, чтобы читатели не отказались преждевременно от прекрасной библиотеки blessings. Ваше здоровье ;)

avatar
nmenezes
20 октября 2011 в 16:34
3

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

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

avatar
priestc
26 июля 2010 в 07:07
851

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

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

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

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

Jonathan Hartley
13 сентября 2010 в 13:22
400

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

Demolishun
30 ноября 2012 в 13:05
4

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

daviewales
28 июня 2013 в 14:08
67

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

gvalkov
19 февраля 2017 в 17:07
8

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

pretzlstyle
10 февраля 2018 в 02:48
0

Colorama поставляется с Anaconda, тогда как termcolor, предложенный в ответе выше, нет. Это сделало Colorama очень предпочтительным для многих пользователей Python.

Smit Johnth
19 февраля 2018 в 03:32
50

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

Michael Leonard
15 апреля 2018 в 19:38
0

@SmitJohnth только в Windows.

Smit Johnth
16 апреля 2018 в 19:26
0

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

Leogout
28 апреля 2018 в 13:28
0

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

Michael Leonard
1 мая 2018 в 17:58
0

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

gcharbon
12 июня 2018 в 12:22
0

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

mazunki
20 марта 2019 в 18:21
0

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

Jonathan Hartley
20 марта 2019 в 19:55
0

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

mazunki
20 марта 2019 в 19:59
0

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

Jonathan Hartley
7 мая 2019 в 20:49
1

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

Nathan Chappell
7 июля 2020 в 11:12
0

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

Abdul Haseeb
4 октября 2020 в 07:06
0

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

CervEd
4 июня 2021 в 16:18
0

Это чрезмерное упрощение, что colorama.init() требуется для работы в Windows, на самом деле это может даже нарушить цветопередачу в Windows. Это зависит от терминала / среды

avatar
nosklo
2 июля 2009 в 11:59
10

Вот пример curses:

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)
sorin
25 августа 2009 в 16:51
0

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

nosklo
25 августа 2009 в 19:12
2

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

avatar
Samat Jain
16 ноября 2008 в 07:31
961

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

from termcolor import colored

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

Или в Python 3:

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

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

Phil P
29 июля 2011 в 04:16
2

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

Alexander Tsepkov
28 октября 2011 в 02:19
41

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

Janus Troelsen
20 июля 2013 в 19:28
16

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

ereOn
26 февраля 2015 в 17:53
1

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

dtk
28 июня 2015 в 22:04
0

Версия 1.1.0 добавила функцию cprint(): cprint('Hello, World!', 'green', 'on_red').

akxlr
14 ноября 2015 в 02:05
5

termcolor.COLORS дает вам список цветов

ivanleoncz
16 октября 2018 в 22:50
1

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

Szabolcs
12 декабря 2018 в 16:53
47

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

wizzwizz4
17 марта 2019 в 20:48
2

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

Yan King Yin
11 октября 2020 в 03:00
0

В Linux: pip install python-termcolor

sakiM
28 декабря 2020 в 02:39
0

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

avatar
orip
13 ноября 2008 в 22:22
39

В 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 сентября 2019 в 13:07
3

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

Endre Both
6 декабря 2019 в 10:04
0

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

Sorry IwontTell
7 мая 2020 в 15:18
1

Я с Данилой.

Ekrem Dinçel
24 июня 2020 в 14:16
2

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

avatar
tzot
13 ноября 2008 в 19:53
6

Для символов

Ваш терминал, скорее всего, использует символы 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()

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

Для цветов

curses - это модуль, который вы хотите использовать. Посмотрите этот учебник.

avatar
suhib-alsisan
13 ноября 2008 в 19:38
15

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

print " "+ "\033[01;41m" + " " +"\033[01;46m"  + "  " + "\033[01;42m"
pragmatic
8 января 2013 в 12:18
0

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

avatar
joeld
13 ноября 2008 в 19:25
2252

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

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

Adobe
1 августа 2012 в 09:04
0

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

Dennis
1 октября 2012 в 19:57
0

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

Martin Ueding
3 ноября 2012 в 11:04
9

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

Sebastian Mach
9 апреля 2014 в 06:27
4

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

cregox
11 апреля 2014 в 08:17
0

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

Ethan Bierlein
16 апреля 2014 в 23:08
0

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

user393267
4 июля 2015 в 03:54
0

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

mike
14 июля 2015 в 22:57
0

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

Alexander Simko
28 февраля 2016 в 13:18
0

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

Toby Speight
1 марта 2016 в 18:28
0

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

Samy Bencherif
3 июня 2016 в 05:59
0

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

Eryk Sun
1 сентября 2016 в 23:37
0

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

Eryk Sun
1 сентября 2016 в 23:38
6

@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).

balu
8 октября 2017 в 09:23
0

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

balu
8 октября 2017 в 09:27
3

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

Joren
10 января 2018 в 21:13
0

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

Noel
21 января 2018 в 09:13
0

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

gjois
2 июля 2019 в 06:51
0

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

BayesianMonk
6 октября 2020 в 10:56
0

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

This
14 октября 2020 в 11:02
0

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

CrazyVideoGamer
16 июля 2021 в 13:06
1

В Windows вы можете заставить работать escape-коды ansi, выполнив команду color в cmd. Просто введите os.system("color")

avatar
Bryan Oakley
13 ноября 2008 в 19:22
103

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

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

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

Для символа блока попробуйте использовать символ Юникода, например \ u2588:

print(u"\u2588")

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

print(CSI+"31;40m" + u"\u2588" + CSI + "0m")
Evgeni Sergeev
29 декабря 2013 в 10:56
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)])

MohitC
26 декабря 2017 в 12:31
0

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

Qohelet
18 февраля 2021 в 14:28
0

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

Bryan Oakley
18 февраля 2021 в 15:25
0

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

Qohelet
18 февраля 2021 в 15:41
0

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

avatar
daharon
13 ноября 2008 в 19:13
18

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

Также запустите это, и вы найдете свой ящик:

for i in range(255):
    print i, chr(i)
Jonathan Hartley
18 августа 2015 в 11:09
0

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

avatar
UberJumper
13 ноября 2008 в 19:06
24

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

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

Цвета

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

#
mousetail
3 октября 2020 в 12:57
0

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