我写了很多小助手脚本,并且经常在终端中打印彩色文本。为了简化它们的打包和分发,我经常希望这些小脚本没有任何依赖性。
因此我在脚本中重复这样的数据:
ansi_colors = {
None: '\x1b[0m', # actually black but whatevs
'red': '\x1b[31m',
'green' : '\x1b[32m',
...
}
这些数据是否存在于核心库的任何位置?我挖了一遍,发现curses
有一些COLOR_*
常数,但它们只是整数,并且这些转换为ANSI转义码的方式并不明显。
我已经知道termcolor
,colorama
,blessings
等模块,所以请不要建议使用这些模块 - 我只想依赖标准库。
答案 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)