# Python在Windows的命令行中输出彩色文字的技巧

- Link: https://www.xuepaijie.com/html/skill/devops/900.html
- Published: 2017-03-19T15:10:09+08:00
- Author: Admin

有时候我们想要用不同色彩的文字来区分下，但是在Windows上不同于Mac或Linux，无法使用\
033的方法，那怎么办呢？这里我们将对Windows下命令行输出彩色文字进行分析。

首先我们来看一段代码，品味下是怎么生成彩色的：

    ```html;
    std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)

    def set_cmd_text_color(color, handle=std_out_handle):
        Bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
        return Bool
    ```

这一块是和Windows的编程特性有关，我们不深入进去，有兴趣自查资料。

我们已经看到，定义了一个『set_cmd_text_color』函数：

    ```html;
    set_cmd_text_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
    ```

这个函数支持2位十六进制编码，比如0x12，0x03，0xef。取值都是0~f。区别在于，前一位
指的是背景色，后一位指的是前景色，我们为了方便，可以给这些颜色编码定义一些有意义
的别名。比如：

    ```html;
    # Windows CMD命令行 字体颜色定义 text colors
    FOREGROUND_BLACK = 0x00 # black.
    FOREGROUND_DARKBLUE = 0x01 # dark blue.
    FOREGROUND_DARKGREEN = 0x02 # dark green.
    FOREGROUND_DARKSKYBLUE = 0x03 # dark skyblue.
    FOREGROUND_DARKRED = 0x04 # dark red.
    FOREGROUND_DARKPINK = 0x05 # dark pink.
    FOREGROUND_DARKYELLOW = 0x06 # dark yellow.
    FOREGROUND_DARKWHITE = 0x07 # dark white.
    FOREGROUND_DARKGRAY = 0x08 # dark gray.
    FOREGROUND_BLUE = 0x09 # blue.
    FOREGROUND_GREEN = 0x0a # green.
    FOREGROUND_SKYBLUE = 0x0b # skyblue.
    FOREGROUND_RED = 0x0c # red.
    FOREGROUND_PINK = 0x0d # pink.
    FOREGROUND_YELLOW = 0x0e # yellow.
    FOREGROUND_WHITE = 0x0f # white.

    # Windows CMD命令行 背景颜色定义 background colors
    BACKGROUND_BLUE = 0x10 # dark blue.
    BACKGROUND_GREEN = 0x20 # dark green.
    BACKGROUND_DARKSKYBLUE = 0x30 # dark skyblue.
    BACKGROUND_DARKRED = 0x40 # dark red.
    BACKGROUND_DARKPINK = 0x50 # dark pink.
    BACKGROUND_DARKYELLOW = 0x60 # dark yellow.
    BACKGROUND_DARKWHITE = 0x70 # dark white.
    BACKGROUND_DARKGRAY = 0x80 # dark gray.
    BACKGROUND_BLUE = 0x90 # blue.
    BACKGROUND_GREEN = 0xa0 # green.
    BACKGROUND_SKYBLUE = 0xb0 # skyblue.
    BACKGROUND_RED = 0xc0 # red.
    BACKGROUND_PINK = 0xd0 # pink.
    BACKGROUND_YELLOW = 0xe0 # yellow.
    BACKGROUND_WHITE = 0xf0 # white.
    ```

我们可以把每种颜色代码都封装成了易用的函数，可以根据需要在自己的脚本里直接导入相应
函数进行彩色输出。

比如原来是 print ‘hello’   现在直接 printBlue(‘hello’) 就可以了。

    ```html;
    #coding=utf-8

    import ctypes
    import sys

    STD_INPUT_HANDLE = -10
    STD_OUTPUT_HANDLE = -11
    STD_ERROR_HANDLE = -12

    # 字体颜色定义 ,关键在于颜色编码，由2位十六进制组成，分别取0~f，前一位指的是背景色，后一位指的是字体色
    #由于该函数的限制，应该是只有这16种，可以前景色与背景色组合。也可以几种颜色通过或运算组合，组合后还是在这16种颜色中

    # Windows CMD命令行 字体颜色定义 text colors
    FOREGROUND_BLACK = 0x00 # black.
    FOREGROUND_DARKBLUE = 0x01 # dark blue.
    FOREGROUND_DARKGREEN = 0x02 # dark green.
    FOREGROUND_DARKSKYBLUE = 0x03 # dark skyblue.
    FOREGROUND_DARKRED = 0x04 # dark red.
    FOREGROUND_DARKPINK = 0x05 # dark pink.
    FOREGROUND_DARKYELLOW = 0x06 # dark yellow.
    FOREGROUND_DARKWHITE = 0x07 # dark white.
    FOREGROUND_DARKGRAY = 0x08 # dark gray.
    FOREGROUND_BLUE = 0x09 # blue.
    FOREGROUND_GREEN = 0x0a # green.
    FOREGROUND_SKYBLUE = 0x0b # skyblue.
    FOREGROUND_RED = 0x0c # red.
    FOREGROUND_PINK = 0x0d # pink.
    FOREGROUND_YELLOW = 0x0e # yellow.
    FOREGROUND_WHITE = 0x0f # white.

    # Windows CMD命令行 背景颜色定义 background colors
    BACKGROUND_BLUE = 0x10 # dark blue.
    BACKGROUND_GREEN = 0x20 # dark green.
    BACKGROUND_DARKSKYBLUE = 0x30 # dark skyblue.
    BACKGROUND_DARKRED = 0x40 # dark red.
    BACKGROUND_DARKPINK = 0x50 # dark pink.
    BACKGROUND_DARKYELLOW = 0x60 # dark yellow.
    BACKGROUND_DARKWHITE = 0x70 # dark white.
    BACKGROUND_DARKGRAY = 0x80 # dark gray.
    BACKGROUND_BLUE = 0x90 # blue.
    BACKGROUND_GREEN = 0xa0 # green.
    BACKGROUND_SKYBLUE = 0xb0 # skyblue.
    BACKGROUND_RED = 0xc0 # red.
    BACKGROUND_PINK = 0xd0 # pink.
    BACKGROUND_YELLOW = 0xe0 # yellow.
    BACKGROUND_WHITE = 0xf0 # white.

    std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)

    def set_cmd_text_color(color, handle=std_out_handle):
        Bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
        return Bool

    #重置色彩
    def resetColor():
        set_cmd_text_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)

    #暗蓝色
    #dark blue
    def printDarkBlue(mess):
        set_cmd_text_color(FOREGROUND_DARKBLUE)
        sys.stdout.write(mess)
        resetColor()

    #暗绿色
    #dark green
    def printDarkGreen(mess):
        set_cmd_text_color(FOREGROUND_DARKGREEN)
        sys.stdout.write(mess)
        resetColor()

    #暗天蓝色
    #dark sky blue
    def printDarkSkyBlue(mess):
        set_cmd_text_color(FOREGROUND_DARKSKYBLUE)
        sys.stdout.write(mess)
        resetColor()

    #暗红色
    #dark red
    def printDarkRed(mess):
        set_cmd_text_color(FOREGROUND_DARKRED)
        sys.stdout.write(mess)
        resetColor()

    #暗粉红色
    #dark pink
    def printDarkPink(mess):
        set_cmd_text_color(FOREGROUND_DARKPINK)
        sys.stdout.write(mess)
        resetColor()

    #暗黄色
    #dark yellow
    def printDarkYellow(mess):
        set_cmd_text_color(FOREGROUND_DARKYELLOW)
        sys.stdout.write(mess)
        resetColor()

    #暗白色
    #dark white
    def printDarkWhite(mess):
        set_cmd_text_color(FOREGROUND_DARKWHITE)
        sys.stdout.write(mess)
        resetColor()

    #暗灰色
    #dark gray
    def printDarkGray(mess):
        set_cmd_text_color(FOREGROUND_DARKGRAY)
        sys.stdout.write(mess)
        resetColor()

    #蓝色
    #blue
    def printBlue(mess):
        set_cmd_text_color(FOREGROUND_BLUE)
        sys.stdout.write(mess)
        resetColor()

    #绿色
    #green
    def printGreen(mess):
        set_cmd_text_color(FOREGROUND_GREEN)
        sys.stdout.write(mess)
        resetColor()

    #天蓝色
    #sky blue
    def printSkyBlue(mess):
        set_cmd_text_color(FOREGROUND_SKYBLUE)
        sys.stdout.write(mess)
        resetColor()

    #红色
    #red
    def printRed(mess):
        set_cmd_text_color(FOREGROUND_RED)
        sys.stdout.write(mess)
        resetColor()

    #粉红色
    #pink
    def printPink(mess):
        set_cmd_text_color(FOREGROUND_PINK)
        sys.stdout.write(mess)
        resetColor()

    #黄色
    #yellow
    def printYellow(mess):
        set_cmd_text_color(FOREGROUND_YELLOW)
        sys.stdout.write(mess)
        resetColor()

    #白色
    #white
    def printWhite(mess):
        set_cmd_text_color(FOREGROUND_WHITE)
        sys.stdout.write(mess)
        resetColor()

    #白底黑字
    #white bkground and black text
    def printWhiteBlack(mess):
        set_cmd_text_color(FOREGROUND_BLACK | BACKGROUND_WHITE)
        sys.stdout.write(mess)
        resetColor()

    #白底黑字
    #white bkground and black text
    def printWhiteBlack_2(mess):
        set_cmd_text_color(0xf0)
        sys.stdout.write(mess)
        resetColor()

    #黄底蓝字
    #white bkground and black text
    def printYellowRed(mess):
        set_cmd_text_color(BACKGROUND_YELLOW | FOREGROUND_RED)
        sys.stdout.write(mess)
        resetColor()

    if __name__ == '__main__':
        printDarkBlue('暗蓝色文字')

    # Python2.x下使用记得encode('gb2312')
    ```
