输出彩色命令行

最后更新时间: 2018-09-15 | 作者: AberSheeran | 捐助

据现有的信息,Windows7之后的Windows系统自带的CMD或者Powershell,就不再支持ANSI代码来控制颜色了。那么我们如果想要改变Windows的命令行颜色,只好通过Windows给的句柄来控制颜色。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import sys
import ctypes

if sys.platform.startswith('win'):
    stdout = ctypes.windll.kernel32.GetStdHandle(-11)
    def printf(value, color=None, **kwargs):
        if color is None:
            print(value, flush=True, **kwargs)
        elif color == "green":
            ctypes.windll.kernel32.SetConsoleTextAttribute(stdout, 0x0a)
            print(value, flush=True, **kwargs)
        elif color == "yellow":
            ctypes.windll.kernel32.SetConsoleTextAttribute(stdout, 0x0e)
            print(value, flush=True, **kwargs)
        elif color == "red":
            ctypes.windll.kernel32.SetConsoleTextAttribute(stdout, 0x0c)
            print(value, flush=True, **kwargs)
        else:
            raise AttributeError("The color is unexpected!")
        ctypes.windll.kernel32.SetConsoleTextAttribute(stdout, 0x0f)

首先ctypes.windll.kernel32.GetStdHandle(-11)是获取stdout的句柄。然后通过ctypes.windll.kernel32.SetConsoleTextAttribute(句柄,颜色代码)控制文字和背景颜色。

为了代码更好看,我们或许需要更好的封装这些函数。但这些都没必要,Python的哲学就是别造重复的轮子

Colorama

只需要pip install colorama,就可以使用大神封装好的跨平台命令行颜色控制库。

可用格式参数如下

在Github上给的样例如下

1
2
3
4
5
6
from colorama import Fore, Back, Style
print(Fore.RED + 'some red text')
print(Back.GREEN + 'and with a green background')
print(Style.DIM + 'and in dim text')
print(Style.RESET_ALL)
print('back to normal now')

可以在代码前加以下两行让Python的print支持ASNI代码来控制任意平台的输出颜色

1
2
from colorama import init
init()

需要自动回复字体颜色还可以这样

1
2
from colorama import init
init(autoreset=True)

就无须手动恢复字体颜色了。