终端colored print

因为看lilac的源码,看到了带有颜色的logging模块,想到自己曾经在wordpress上写的一片文章《printf有趣的\033》,所以一并可以把文章迁移过来。

shell终端中

1
echo '\033[44;37;5m hello world\033[0m'

会打印出蓝底白字的hell world,这一效果在C中同样可以。

1
2
3
4
5
int main(int argc,char **argv)
{
printf("\033[44;37;5m hello world\033[0m");
return 0;
}

代码解析

1
2
3
4
5
\033     [1;     33;     1m;     xxxx     \033[0m

| | | | | |

开始 背景色 字体色 设置粗体 字符串 结束

其他参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
编码    颜色/动作  (m字符前使用)
0       重新设置属性到缺省设置
1       设置粗体
2       设置一半亮度(模拟彩色显示器的颜色)
4       设置下划线(模拟彩色显示器的颜色)
5       设置闪烁
7       设置反向图象
22      设置一般密度
24      关闭下划线
25      关闭闪烁
27      关闭反向图象
30      设置黑色前景
31      设置红色前景
32      设置绿色前景
33      设置棕色前景
34      设置蓝色前景
35      设置紫色前景
36      设置青色前景
37      设置白色前景
38      在缺省的前景颜色上设置下划线
39      在缺省的前景颜色上关闭下划线
40      设置黑色背景
41      设置红色背景
42      设置绿色背景
43      设置棕色背景
44      设置蓝色背景
45      设置紫色背景
46      设置青色背景
47      设置白色背景
49      设置缺省黑色背景

以及其他有趣代码

1
2
3
4
5
6
7
\033[2J          清除屏幕
\033[0q          关闭所有的键盘指示灯
\033[1q          设置“滚动锁定”指示灯 (Scroll Lock)
\033[2q          设置“数值锁定”指示灯 (Num Lock)
\033[3q          设置“大写锁定”指示灯 (Caps Lock)
\033[15:40H     把关闭移动到第15行,40列
\007              发蜂鸣生beep

所以Python中可以这样做一个染色类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Color(object):
colors = {
'black': 30,
'red': 31,
'green': 32,
'yellow': 33,
'blue': 34,
'magenta': 35,
'cyan': 36,
'white': 37,
'bgred': 41,
'bggrey': 100
}

prefix = '\033['

suffix = '\033[0m'

def __call__(self, text, color):
return self.colored(text, color)

def colored(self, text, color=None):
if color not in self.colors:
color = 'white'

clr = self.colors[color]
return (self.prefix+'%dm%s'+self.suffix) % (clr, text)

colored = Color()