2016-05-11 3 views
4

Я пишу много маленьких вспомогательных скриптов, и часто они печатают цветной текст в терминале. Для простоты их упаковки и распространения я часто хочу, чтобы эти маленькие скрипты были без каких-либо зависимостей.Есть ли список кодов побега цвета ANSI где-нибудь в стандартных библиотеках?

Поэтому я дублирования данных, как это много в сценариях:

ansi_colors = { 
    None: '\x1b[0m', # actually black but whatevs 
    'red': '\x1b[31m', 
    'green' : '\x1b[32m', 
    ... 
} 

существуют эти данные где-нибудь в основных библиотеках ли? Я выкопался и обнаружил, что curses имеет некоторые константы COLOR_*, но они всего лишь целые числа, и неясно, как они преобразуются в escape-коды ANSI.

Я уже в курсе модулей как termcolor, colorama, blessings, поэтому, пожалуйста, не предлагают использовать те - Я хочу, чтобы зависеть только стандартные библиотеки.

+0

'человек terminfo' является бит справки, показывающий две стандартные цветовые карты. – mpez0

ответ

2

Вы можете проверить страницу руководства console_codes(4). То, что вы хотите это ECMA-48 Набор Графика Цветопередача:

ECMA-48 SGR последовательности ESC [ parameters m наборов отображения атрибутов. Несколько атрибутов могут быть установлены в одной и той же последовательности, разделенные точкой с запятой . Пустым параметром (между точкой с запятой или строкой инициатором или терминатором) является , интерпретируемым как ноль.

param result 
    0  reset all attributes to their defaults 
    1  set bold 
    2  set half-bright (simulated with color on a color display) 
    4  set underscore (simulated with color on a color display) (the colors used to 
      simulate dim or underline are set using ESC ] ...) 
    5  set blink 
    7  set reverse video 
    10  reset selected mapping, display control flag, and toggle meta flag (ECMA-48 
      says "primary font"). 
    11  select null mapping, set display control flag, reset toggle meta flag 
      (ECMA-48 says "first alternate font"). 
    12  select null mapping, set display control flag, set toggle meta flag (ECMA-48 
      says "second alternate font"). The toggle meta flag causes the high bit of a 
      byte to be toggled before the mapping table translation is done. 
    21  set normal intensity (ECMA-48 says "doubly underlined") 
    22  set normal intensity 
    24  underline off 
    25  blink off 
    27  reverse video off 
    30  set black foreground 
    31  set red foreground 
    32  set green foreground 
    33  set brown foreground 
    34  set blue foreground 
    35  set magenta foreground 
    36  set cyan foreground 
    37  set white foreground 
    38  set underscore on, set default foreground color 
    39  set underscore off, set default foreground color 
    40  set black background 
    41  set red background 
    42  set green background 
    43  set brown background 
    44  set blue background 
    45  set magenta background 
    46  set cyan background 
    47  set white background 
    49  set default background color 

Я не думаю, что они доступны, как есть в любом стандартном модуле Python. Но если вы посмотрите внимательно, вы заметите, что цвета переднего плана: 30, а также curses, а цвета фона - 40, а также константа curses. Таким образом, вы можете написать что-то вроде этого:

import curses 
def fcolor(c): 
    return '\x1B[{0}m'.format(30 + c) 
def bcolor(c): 
    return '\x1B[{0}m'.format(40 + c) 
def fbcolor(f, b): 
    return '\x1B[{0};{1}m'.format(30 + f, 40 + b) 

print(fbcolor(curses.COLOR_RED, curses.COLOR_YELLOW) + "hello!") 
2

Это зависит от того, что вы хотите. Цвет ANSI технически относится к 8-цветной палитре, подразумеваемой ECMA-48 (ISO-6429), которая назвала константы в проклятиях. Библиотеки не сохраняют escape-последовательности; они находятся в базе данных . Для терминала ANSI (sic) эти последовательности соответствуют escape-последовательностям, которые устанавливают графическое преобразование (атрибуты видео, такие как полужирный, подчеркивающий, обратный — и цвет).

termcap, terminfo и curses используют более общее понятие, в котором вы начинаете с номера цвета и генерируете escape-последовательность, которая может создавать соответствующий цвет. Терминалы могут не иметь цветов, нескольких цветов (например, 8, но, возможно, 16, 88, 256 для xterm и аналогичных терминалов). Информация, сообщающая, как это сделать, хранится в базе данных терминала с именем возможностей. Для того, чтобы установить цвет переднего плана на ANSI, вы должны использовать setaf, либо с помощью вызова библиотеки или приложения командной строки, такие как tput, например,

tput setaf 4 

для цвета 4 (синий).Простые приложения используют низкоуровневые termcap или terminfo интерфейсы, как правило, с базами данных terminfo. Хотя вы, возможно, склонны форматировать свои собственные escape-последовательности, эти интерфейсы предоставляют функции форматирования, которые позволяют вам не знать, сколько цветов может поддерживать терминал. База данных терминалов сообщает вашей программе, используя переменную окружения TERM, чтобы выбрать фактическое описание терминала. Если у вас есть терминал, поддерживающий более 8 цветов, escape-последовательность - , а не, сформированная путем добавления 30 или 40 к номеру цвета.

Ниже приведен пример использования интерфейса TERMINFO низкого уровня из Python:

import curses 

curses.setupterm() 
curses.putp(curses.tparm(curses.tigetstr("setaf"), curses.COLOR_RED)) 
curses.putp(curses.tparm(curses.tigetstr("setab"), curses.COLOR_YELLOW)) 
curses.putp("hello!") 
curses.putp(curses.tigetstr("sgr0")) 
curses.putp("\n") 

Дальнейшее чтение:

Смежные вопросы