标准库中某处有ANSI颜色转义码列表吗?

时间:2016-05-11 18:47:07

标签: python curses python-curses ansi-colors

我写了很多小助手脚本,并且经常在终端中打印彩色文本。为了简化它们的打包和分发,我经常希望这些小脚本没有任何依赖性。

因此我在脚本中重复这样的数据:

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

这些数据是否存在于核心库的任何位置?我挖了一遍,发现curses有一些COLOR_*常数,但它们只是整数,并且这些转换为ANSI转义码的方式并不明显。

我已经知道termcolorcoloramablessings等模块,所以请不要建议使用这些模块 - 我只想依赖标准库。

3 个答案:

答案 0 :(得分:4)

您可以查看手册页console_codes(4)。你想要的是ECMA-48 Set Graphics Rendition:

  

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

答案 1 :(得分:2)

这取决于你想要什么。 ANSI颜色在技术上是指ECMA-48(ISO-6429)隐含的8色调色板,它在curses中命名了常量。库不存储转义序列;它们位于数据库中。对于 ANSI (sic)终端,它们对应于设置图形再现的转义序列(视频属性,如粗体,下划线,反向和颜色)。

termcap,terminfo和curses使用更一般的概念,您可以从颜色编号开始,并生成可以生成相应颜色的转义序列。终端可以没有颜色,多种颜色(例如8个,但xterm和类似终端可能有16个,88个,256个)。告知如何执行此操作的信息存储在终端数据库中,名为 capabilities 。要设置 ANSI 前景色,可以使用setaf,使用库调用或命令行应用程序,例如tput,例如,

tput setaf 4

表示颜色4(蓝色)。简单的应用程序使用低级termcap或terminfo接口,通常使用terminfo数据库。虽然您可能倾向于格式化自己的转义序列,但这些接口提供了格式化功能,可以让您避免知道终端可能支持的颜色数量。终端数据库告诉您的程序,使用TERM环境变量来选择实际的终端描述。如果您的终端支持8种以上的颜色,则通过向颜色编号添加30或40来形成转义序列

以下是使用Python的低级terminfo接口的示例:

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

进一步阅读:

答案 2 :(得分:0)

Rodrigo提供了一个很好的答案,尽管颜色仅限于前景色的前8种颜色。这是我对处理16种前景色的一点贡献

def fcolor(c):
    if c>7:
        return '\x1B[1;{0}m'.format(22 + c)
    else:
        return '\x1B[0;{0}m'.format(30 + c)
def bcolor(c):
    return '\x1B[{0}m'.format(40 + c)
def fbcolor(f, b):
    if f>7:
        return '\x1B[1;{0};{1}m'.format(22 + f, 40 + b)
    else:
        return '\x1B[0;{0};{1}m'.format(30 + f, 40 + b)