Як надрукувати кольоровий текст у терміналі в Python?


2125

Як я можу вивести кольоровий текст до терміналу в Python? Який найкращий символ Unicode для відображення суцільного блоку?


6
Вам слід вказати додаткову інформацію, щоб отримати кращі відповіді: багатоплатформа? чи приймаються зовнішні модулі?
sorin

2
IPython робить це, кросплатформний. Подивіться, що вони використовують?
ендоліт

Цей символ мав би чудовий кольоровий блок: проблема лише в тому, що він розширений ASCII, можливо, ви могли б змусити його працювати, використовуючиhttp://stackoverflow.com/questions/8465226/using-extended-ascii-codes-with-python
Samy Bencherif

Деякі термінали також можуть відображати символи Unicode. Якщо це справедливо для вашого терміналу, можливі символи майже необмежені.
айке

4
Відповідь на це запитання прийшла досить пізно, але це , здається, краще для мене ... ті проголосували вище цього вимагають спеціальних хаков для Windows , в той час як це один раз працює: stackoverflow.com/a/3332860/901641
ArtOfWarfare

Відповіді:


1832

Це дещо залежить від того, на якій платформі ви знаходитесь. Найпоширеніший спосіб це зробити, надрукувавши послідовності втечі ANSI. Для простого прикладу, ось код python із сценаріїв побудови блендера :

class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    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)

або, з Python3.6 +:

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

Це буде працювати над Unixes, включаючи OS X, Linux та Windows (за умови використання ANSICON або в Windows 10 за умови включення емуляції VT100 ). Існують коди ansi для встановлення кольору, переміщення курсору тощо.

Якщо ви зіткнетеся з цим (і це здається, що ви є, якщо пишете гру), вам слід заглянути в модуль "прокляття", який обробляє безліч складних для вас частин. Python Прокляття HOWTO є хорошим введенням.

Якщо ви не використовуєте розширений ASCII (тобто не на ПК), ви застрягли з символами ascii нижче 127, а "#" або "@" - це, мабуть, найкраща ставка для блоку. Якщо ви можете переконатися, що ваш термінал використовує розширений набір символів ASCII IBM , у вас є багато інших варіантів. Символи 176, 177, 178 та 219 є "символами блоків".

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

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

Хм .. я думаю, трохи захопився цією відповіддю. Хоча я в середині планування епічної пригодницької гри на тексті. Удачі з кольоровим текстом!


Але припустимо, що моє запит за замовчуванням не є чорним - ви вважаєте, що після цих хитрощів можливо зробити пітон переосмисленням?
Adobe

4
У Linux, ви можете використовувати tput, як так , так як це призводить до більш переноситься коду.
Мартін Удінг

3
@Cawas: справжній випадок використання - disableце коли ви передаєте вихід у файл; Хоча такі інструменти catможуть підтримувати кольори, як правило, краще не друкувати інформацію про кольори у файли.
Себастьян Мах

1
@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).
Ерик Нд

1
Кожен, хто використовує приклад прикладу Python з відповіді: Слід зазначити, що кольори в діапазоні 90-97 та 100-107 є нестандартними, і справді, на моєму терміналі вони не всі надають кольори, позначені назви змінних. Краще використовувати стандартні діапазони 30-37 і 40-47. Джерело: en.wikipedia.org/wiki/…
balu

805

Я здивований, що ніхто не згадав модуль Python termcolor . Використання досить просте:

from termcolor import colored

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

Або в Python 3:

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

Однак це може бути недостатньо складним для ігрового програмування та "кольорових блоків", які ви хочете зробити ...


2
Оскільки він видає ANSI-коди, чи працює він на Windows (консолі DOS), якщо ansi.sys завантажений? support.microsoft.com/kb/101875
Phil P

37
Щойно зауважив, що станом на 13.01.2011 він зараз під ліцензією MIT
Олександр Цепков

12
не має одиничних тестів (на відміну від колорами) та не оновлюється з 2011 року
Janus Troelsen

5
termcolor.COLORSнадає вам список кольорів
akxlr

23
У Windows запускається os.system('color')спочатку, після чого послідовності втечі ANSI починають працювати.
Szabolcs

717

Відповідь - « Колорама» на всі крос-платформні забарвлення в Python.

Приклад скріншоту Python 3.6: приклад скріншоту


317
Як автор Colorama, дякую за згадку @ nbv4. Я спробую трохи уточнити: Colorama прагне дозволити програмам Python друкувати кольоровий термінальний текст на всіх платформах, використовуючи ті самі коди ANSI, що описані в багатьох інших відповідях на цій сторінці. У Windows Colorama позбавляє цих символів ANSI від stdout та перетворює їх у еквівалентні виклики win32 для кольорового тексту. На інших платформах Colorama нічого не робить. Отже, ви можете використовувати ANSI-коди або модулі типу Termcolor, а з Colorama вони просто працюють на всіх платформах. Це ідея, як би там не було.
Джонатан Хартлі

2
@Jonathan, Це справді дивовижна бібліотека! Можливість перехресного кольорового виходу Python на платформі дійсно приємна і корисна. Я надаю інструменти для бібліотеки, яка забарвлює власну консоль. Я можу перенаправити вихід цієї консолі на термінал і розфарбувати вихід. Тепер я можу навіть набрати бібліотеку і дозволити користувачеві вибрати кольори. Це дозволить кольоровим людям налаштувати роботу так, щоб вони насправді могли правильно бачити вихід. Спасибі
Демолішун

50
Це повинно бути в стандартній бібліотеці ... Я думаю, важлива підтримка кольорових платформ.
daviewales

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

30
Це не працює без виклику colorama.init (). Голосуйте!
Smit Johnth,

427

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

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

Приклад з прикладом зеленого фону

Отримайте таблицю параметрів формату тексту оболонки із наступним кодом:

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

Приклад "Світло-темно" (повністю)

введіть тут опис зображення

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

верхня частина продукції


8
це працює як у більшості оболонок, так і в ipython, досить добре для більшості застосувань
дефіс

4
чи можу я запитати, який це термінал?
FlipTack

4
наскільки це портативно?
Ruggero Turra

2
Короткий автономний вклад
Джонатан Н

203

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

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

Це виробляє наступне bash, в urxvtз колірною гамою Zenburn стилю:

кольори виводу

Завдяки експериментуванню ми можемо отримати більше кольорів:

кольорова матриця

Примітка: \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

2
як ти зробив txt блимати
WiLL_K

2
Яка оболонка або термінал змушує блимати?
Zypps987

1
(u) rxvt наприклад
qubodup

6
Миготливий текст працює дуже добре. Як я можу це зупинити? Усі послідовні відбитки миготять чомусь. Мій термінал вважає, що пора вечірки!
капітан

3
В кінці рядок, який потрібно блимати, ставити \33[0mабо CENDвище.
Stiffy2000

94

Ви хочете дізнатися про послідовності втечі ANSI. Ось короткий приклад:

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

Для отримання додаткової інформації див. Http://en.wikipedia.org/wiki/ANSI_escape_code

Для символу блоку спробуйте символ Unicode, як \ u2588:

print(u"\u2588")

Збираємо все це разом:

print(CSI+"31;40m" + u"\u2588" + CSI + "0m")

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

71

Я відповідаю, тому що я знайшов спосіб використовувати ANSI-коди в Windows 10, щоб ви могли змінити колір тексту без будь-яких вбудованих модулів:

Рядок, який робить цю роботу, це os.system("")або будь-який інший системний виклик, який дозволяє друкувати коди ANSI у Терміналі:

import os

os.system("")

# Group of Different functions for 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, Windows не підтримує повністю ANSI-коди навіть з цим фокусом. Не всі кольори оформлення тексту працюють, і всі "яскраві" кольори (Коди 90-97 та 100-107) відображаються так само, як і звичайні кольори (Коди 30-37 та 40-47)

Редагування : Дякую @jl, що знайшов ще коротший метод.

tl; dr : додайте os.system("")вгорі файлу.

Версія Python: 3.6.7


2
Це працює - я дуже здивований, що команда кольору дозволяє включити ANSI-коди в терміналі Windows, я роками ходив, не знаючи, що це можливо - сама команда не дає ніякої підказки, що вона це робить.
Стюарт

1
Найпростіший і працює ідеально. Дякую.
Арі

3
Щоб було зрозуміло, це працюватиме лише у Windows 10.
Анаксунаман

2
Не працює в Windows 7 / 8.1.
Нікос

2
Дякую за вашу відповідь, @SimpleBinary! Граючи зі своєю відповіддю, я виявив, що ви можете if sys.platform.lower() == "win32": os.system('color')ще більше спростити , просто замінивши її на просто os.system(''). Жодна умова не потрібна, і код працює як у Windows 10, так і в Linux (коли я тестував його). Як бачите, вам не потрібно робити системний дзвінок color. Дзвінки dir, cd, abcdefі просто порожній рядок відмінно працює (хоча не порожні рядки, швидше за все , друк висновок , який ви не хочете бачити).
JL

60

Мій улюблений спосіб - це бібліотека Благословень (повне розкриття: я написав це). Наприклад:

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-кольорів. Він також зберігає нечитабельні послідовності втечі з вашого коду, залишаючись короткими для використання. Веселіться!


65
Додавання кольору як імені функції, а не як параметра є сумнівною практикою.
LtWorf

1
@LtWorf: ви можете легко зробити його параметром, використовуючи, getattrякщо він вам потрібен. Або, швидше за все, просто створіть рядок формату динамічно.
jfs

8
@progo те, що ти можеш це зробити, не означає, що ти повинен це робити. Це більш загальне, якщо колір - це параметр, який ви можете просто передати.
LtWorf

2
Ви can just passфункція пітона.
MaxNoe

2
Зауважте, що імпорт благ не працює на Windows, тому не використовуйте його, якщо ваш сценарій повинен бути кросплатформенним.
Adversus

58

sty схожий на колораму, але він менш багатослівний, підтримує 8- бітовий та 24- бітовий (ггб ) кольори, дозволяє реєструвати власні стилі, підтримує вимкнення звуку, справді гнучкий, добре документований тощо.

Приклади:

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

відбитки:

введіть тут опис зображення

Демонстрація: введіть тут опис зображення


7
Було б дуже корисно, якщо ви подумаєте порівняти його з колорамою, я віддаю перевагу вашій бібліотеці, але тільки тому, що більше коротких api з коробки, і було б чудово, якщо вона буде популярнішою. Дякую!
Віктор Гавро

Мені подобається sty, і я намагаюсь відформатувати свій рядок стилем, одна проблема полягає в тому, що коли я друкую кілька кольорів, чи можу я скинути попередній колір замість кольору за замовчуванням?
intijk

@VictorGavro Це гарна ідея! Я можу додати порівняння до документації.
Ротарети

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

53

створив клас з усіма кольорами, використовуючи цикл 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'

44

Спробуйте цей простий код

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

19
Рекомендація: визначте лямбдати, які повертають цей кольоровий рядок, а не друкуйте їх безпосередньо, щоб його можна було використовувати разом з іншими рядками.
gustafbstrom

34

У Windows ви можете використовувати модуль 'win32console' (доступний у деяких дистрибутивах Python) або модуль 'ctypes' (Python 2.5 і вище) для доступу до API Win32.

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

2
Чесно кажучи, це єдине рішення, яке працює з вікнами. Усі інші відповіді - це лише копія однодумців.
Данило

FWIW, у Windows може бути менше болю використовувати ConEmu, який підтримує послідовності ANSI (крім безлічі інших переваг перед рідним терміналом). Але все-таки чудово мати рідне рішення.
Endre обидва

Я з Данилом.
Мухаммед Алі

24

Дуже просто на основі відповіді @ joeld

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

2
Це призведе до краху, якщо ви передасте більше одного позиційного аргументу чи іншого, крім типу рядка
Ромен Вінсент

@RomainVincent Тоді не передайте більше одного позиційного аргументу чи іншого, крім рядка ty - зачекайте, це print-заміни ? Заперечення скасовано.
wizzwizz4

1
@ wizzwizz4 Я не впевнений, що ти мав на увазі під цим коментарем, я все одно не бачу сенсу. Якщо ви збираєтеся запропонувати клас ..., щоб замінити метод таким простим, як друк, ви також можете уникнути його настільки легко зламання. Просто моя думка.
Ромен Вінсент

1
@RomainVincent Я збирався сказати, що ваше заперечення було неправильним, але для заміни функції настільки багатогранною, як printслід переконатися, що вона належним чином повторила її функціональність.
wizzwizz4

1
@RomainVincent реалізує для використання нескінченних аргументів: <code> def purple(cls, *args, **kwargs): print(cls.PURPLE, *args, cls.END, **kwargs)</code>
Emilien Baudet

23

Я завернув @joeld відповідь у модуль із глобальними функціями, який я можу використовувати в будь-якому місці свого коду.

файл: log.py

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

використовувати наступним чином:

 import log
    log.info("Hello World")
    log.err("System Error")

22

Для Windows ви не можете друкувати на консолі кольорами, якщо ви не використовуєте win32api.

Для Linux це так само просто, як використання друку, тут описані послідовності виходу:

Кольори

Для того, щоб символ друкувався як поле, це дійсно залежить від того, який шрифт ви використовуєте для вікна консолі. Символ фунта працює добре, але це залежить від шрифту:

#

21
# 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))

Текст із зміною переднього плану та фону, кольори 0..141 Текст із зміною переднього плану та фону, кольори 142..255


20

Я закінчив це робити, я відчув, що це найчистіше:

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)

Це дійсно приємно робити це без сторонніх пакетів.
Джеймі Конселл

20

На основі @joeld відповіді, використовуючи 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

Знімок екрана:

введіть тут опис зображення


Деякі оновлення 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

Знімок екрана:

введіть тут опис зображення


20
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

прекрасно працює в python3 ubuntu 18.04
Джуліус Прайого

18

зауважте, наскільки добре 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")

Випробували колораму, використали print(Style.BRIGHT + "Header Test")і print (Style.DIM + word)створили справді приємний підказку.
Том

Це потрібно змінити для використання contextlibдля Py3.
кіт

@cat: З якої версії Python це буде потрібно?
Янус Троельсен

Я вірю 3 і вище - на ньому має бути @contextlib.contextmanagerдекоратор, ні?
кіт

1
@cat: Чому? Чудово працює без.
Янус Троельсен

17

Можна використовувати реалізацію бібліотеки прокльонів Python: http://docs.python.org/library/curses.html

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

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

Особисто я вважаю, що бібліотека "прокляття" була повністю затьмарена "благословеннями", так само "запити" затьмарила "urllib" тощо.
Джонатан Хартлі

17

Ви можете використовувати CLINT:

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

Отримайте його від GitHub .


1
Перше посилання пішло, тому я його видалив; посилання на GH все ще добре (хоча проект "архівований" і в основному відмовлений, від того, що я можу зібрати).
Джакомо Лакава

15

Я знаю, що я спізнююсь. Але, у мене є бібліотека під назвою ColorIt . Це дуже просто.

Ось кілька прикладів:

from ColorIt import *

# Use this to ensure that ColorIt will be usable by certain command line interfaces
initColorIt()

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

Це дає вам:

Зображення ColorIt

Варто також зазначити, що це крос-платформа і перевірена на mac, linux та windows.

Ви можете спробувати це: https://github.com/CodeForeverAndEver/ColorIt

Примітка: Блимання, курсив, напівжирний шрифт тощо будуть додані через кілька днів.



11

Якщо ви використовуєте Windows, то тут ви йдете!

# display text on a Windows console
# Windows XP with Python27 or Python32
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)
проміньте

11

Якщо ви використовуєте Django

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

знімок:

зображення

(Я зазвичай використовую кольоровий вихід для налагодження на терміналі runserver, тому я додав його.)

Ви можете перевірити, чи встановлений він у вашій машині:
$ python -c "import django; print django.VERSION"
Щоб встановити його, перевірте: Як встановити Django

Спробувати!!


10

Ось приклад прокляття:

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: 'модуль' об’єкта не має атрибута 'обгортка'
sorin

1
@Sorin Sbarnea: Відповідно до офіційної документації python curses в docs.python.org/library/curses.html , модуль curses не підтримується у Windows. Можливо, ви отримали цю помилку замість "Немає такого модуля" або щось подібне, тому що ви, ймовірно, назвали свій тестовий файл "curses.py", тому він імпортує себе.
nosklo

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

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:

текст веселого кольору серед шуму ascii


10

Ще один модуль 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'])

Виходи "Привіт, світ!" зі словами синього кольору та знаком оклику жирним червоним кольором та блимає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.