标准库中某处是否有 ANSI 颜色转义码列表?
Is there a list of ANSI color escape codes somewhere in the standard libraries?
我写了很多小帮助脚本,并且经常在终端中打印彩色文本。为了简化打包和分发,我经常希望这些小脚本没有任何依赖关系。
因此我在脚本中大量复制这样的数据:
ansi_colors = {
None: '\x1b[0m', # actually black but whatevs
'red': '\x1b[31m',
'green' : '\x1b[32m',
...
}
这些数据是否存在于核心库中的任何地方?我四处寻找,发现 curses
有一些 COLOR_*
常量,但它们只是整数,它们如何转换为 ANSI 转义码并不明显。
我已经知道 termcolor
、colorama
、blessings
等模块,因此请不要建议使用这些模块 - 我只想依赖标准库。
您可以查看手册页 console_codes(4)
。你想要的是 ECMA-48 Set Graphics Rendition:
The ECMA-48 SGR sequence ESC [ parameters m
sets display attributes.
Several attributes can be set in the same sequence, separated by
semicolons. An empty parameter (between semicolons or string
initiator or terminator) is
interpreted as a zero.
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!")
这取决于你想要什么。 ANSI 颜色 技术上指的是 ECMA-48 (ISO-6429) 隐含的 8 色调色板,它在 curses 中命名常量。图书馆不存储转义序列;这些在 数据库 中。对于 ANSI (原文如此) 终端,这些对应于 设置图形再现 的转义序列(视频属性,例如粗体、下划线、反转 — 和颜色).
termcap、terminfo 和 curses 使用更通用的概念,您从颜色编号开始并生成可以产生相应颜色的转义序列。终端可以没有颜色,也可以有多种颜色(例如 8 种,但 xterm 和类似终端可能有 16、88、256 种)。告诉如何执行此操作的信息存储在名为 capabilities 的终端数据库中。要设置 ANSI 前景颜色,您可以使用 setaf
,使用库调用或命令行应用程序,例如 tput
,例如,
tput setaf 4
颜色 4(蓝色)。简单的应用程序使用低级 termcap 或 terminfo 接口,通常与 terminfo 数据库一起使用。虽然您可能倾向于格式化自己的转义序列,但这些接口提供了格式化功能,让您不必知道终端可能支持多少种颜色。终端数据库告诉您的程序,使用 TERM
环境变量 select 实际的终端描述。如果您的终端支持超过 8 种颜色,则转义序列是 not 由颜色编号加上 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")
进一步阅读:
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)
我写了很多小帮助脚本,并且经常在终端中打印彩色文本。为了简化打包和分发,我经常希望这些小脚本没有任何依赖关系。
因此我在脚本中大量复制这样的数据:
ansi_colors = {
None: '\x1b[0m', # actually black but whatevs
'red': '\x1b[31m',
'green' : '\x1b[32m',
...
}
这些数据是否存在于核心库中的任何地方?我四处寻找,发现 curses
有一些 COLOR_*
常量,但它们只是整数,它们如何转换为 ANSI 转义码并不明显。
我已经知道 termcolor
、colorama
、blessings
等模块,因此请不要建议使用这些模块 - 我只想依赖标准库。
您可以查看手册页 console_codes(4)
。你想要的是 ECMA-48 Set Graphics Rendition:
The ECMA-48 SGR sequence
ESC [ parameters m
sets display attributes. Several attributes can be set in the same sequence, separated by semicolons. An empty parameter (between semicolons or string initiator or terminator) is interpreted as a zero.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!")
这取决于你想要什么。 ANSI 颜色 技术上指的是 ECMA-48 (ISO-6429) 隐含的 8 色调色板,它在 curses 中命名常量。图书馆不存储转义序列;这些在 数据库 中。对于 ANSI (原文如此) 终端,这些对应于 设置图形再现 的转义序列(视频属性,例如粗体、下划线、反转 — 和颜色).
termcap、terminfo 和 curses 使用更通用的概念,您从颜色编号开始并生成可以产生相应颜色的转义序列。终端可以没有颜色,也可以有多种颜色(例如 8 种,但 xterm 和类似终端可能有 16、88、256 种)。告诉如何执行此操作的信息存储在名为 capabilities 的终端数据库中。要设置 ANSI 前景颜色,您可以使用 setaf
,使用库调用或命令行应用程序,例如 tput
,例如,
tput setaf 4
颜色 4(蓝色)。简单的应用程序使用低级 termcap 或 terminfo 接口,通常与 terminfo 数据库一起使用。虽然您可能倾向于格式化自己的转义序列,但这些接口提供了格式化功能,让您不必知道终端可能支持多少种颜色。终端数据库告诉您的程序,使用 TERM
环境变量 select 实际的终端描述。如果您的终端支持超过 8 种颜色,则转义序列是 not 由颜色编号加上 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")
进一步阅读:
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)