在Windows上編寫python程序時,有時候需要對輸出的文字顏色進行設置,特別是日志顯示,不同級別的日志設置不同的顏色進行展示可以直觀查看。本文主要描述通過ctypes.windll.kernel32調用GetStdHandle()和SetConsoleTextAttribute()兩個API實現來實現Windows控制台的彩色背景及彩色文字。
基本概念描述
首先分別介紹GetStdHandle()和SetConsoleTextAttribute()這兩個API。
(1) GetStdHandle()的作用是獲取輸入、輸出/錯誤的屏幕緩沖區的句柄。函數聲明如下:
HANDLE GetStdHandle(
DWORD nStdHandle
);
其參數nStdHandle的值為下面幾種類型的一種:
STD_INPUT_HANDLE 標准輸入的句柄
STD_OUTPUT_HANDLE 標准輸出的句柄
STD_ERROR_HANDLE 標准錯誤的句柄
GetStdHandle()返回標准的輸入、輸出或錯誤的設備的句柄,也就是獲得輸入、輸出/錯誤的屏幕緩沖區的句柄。
(2)SetConsoleTextAttribute() 的作用是在控制台中設置輸入或輸出文本的文本顏色和背景顏色。其函數聲明如下:
BOOL SetConsoleTextAttribute(
HANDLE hConsoleOutput, // console 屏幕緩沖區的句柄
WORD wAttributes // 文本及背景的顏色
);
文本與背景顏色設置可以參考Windows上"color /?"命令的說明。顏色屬性由兩個十六進制數字指定 -- 第一個為背景,第二個則為前景。每個數字可以為以下任何值之一,如下
0 = 黑色 8 = 灰色
1 = 藍色 9 = 淡藍色
2 = 綠色 A = 淡綠色
3 = 淺綠色 B = 淡淺綠色
4 = 紅色 C = 淡紅色
5 = 紫色 D = 淡紫色
6 = 黃色 E = 淡黃色
7 = 白色 F = 亮白色
如果函數設置文本及背景顏色成功,則返回非0。如果設置失敗返回0。
prt_cmd_color.py參考代碼如下:
#-*- coding:utf-8 -*-#
#filename: prt_cmd_color.py
import ctypes,sys STD_INPUT_HANDLE = -10 STD_OUTPUT_HANDLE = -11 STD_ERROR_HANDLE = -12
#字體顏色定義 text colors
FOREGROUND_BLUE = 0x09 # blue.
FOREGROUND_GREEN = 0x0a # green.
FOREGROUND_RED = 0x0c # red.
FOREGROUND_YELLOW = 0x0e # yellow.
# 背景顏色定義 background colors
BACKGROUND_YELLOW = 0xe0 # yellow.
# get handle
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 #reset white
def resetColor(): set_cmd_text_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE) #green
def printGreen(mess): set_cmd_text_color(FOREGROUND_GREEN) sys.stdout.write(mess + '\n') resetColor() #red
def printRed(mess): set_cmd_text_color(FOREGROUND_RED) sys.stdout.write(mess + '\n') resetColor() #yellow
def printYellow(mess): set_cmd_text_color(FOREGROUND_YELLOW) sys.stdout.write(mess + '\n') resetColor() #white bkground and black text
def printYellowRed(mess): set_cmd_text_color(BACKGROUND_YELLOW | FOREGROUND_RED) sys.stdout.write(mess + '\n') resetColor() if __name__ == '__main__': printGreen('printGreen:Gree Color Text') printRed('printRed:Red Color Text') printYellow('printYellow:Yellow Color Text')
輸出展示:
說明:如果需要增加不同前景色或者背景色的組合輸出,可以參考代碼和上述顏色編號增加。
使用實例
1、將上述prt_cmd_color.py文件放在與待執行腳本ping_ip.py同一目錄下。或者通過sys.path.append()將prt_cmd_color.py文件所在的目錄添加到搜索路徑下。
2、ping_ip.py腳本中import prt_cmd_color導入模塊或者執行from prt_cmd_color import printGreen, printRed導入指定函數。
3、ping_ip.py代碼內容如下:
import os, sys sys.path.append('d:\temp') from prt_cmd_color import printGreen, printRed for ip in ['192.168.1.104', '192.168.1.105']: ret = os.system('ping -n 2 -w 3 %s > nul' % (ip,)) if ret == 0: printGreen("%s success" % (ip,)) else: printRed("%s fail" % (ip,))
4、執行結果如下圖所示。命令執行成功,以綠色顯示提示信息,執行失敗以紅色顯示提示信息。