在Python中使用colorama庫(kù)給輸出添加顏色
小張最近遇到一件不大不小的事。他寫了一個(gè)簡(jiǎn)單的登錄測(cè)試腳本,用來(lái)幫同事驗(yàn)證一批用戶的賬號(hào)密碼是否可用。腳本跑起來(lái)很快,刷刷刷一行行結(jié)果往外蹦,“成功”“失敗”“成功”“失敗”……幾十行看下來(lái),他根本看不清哪些失敗了。每次都要在長(zhǎng)長(zhǎng)的輸出里一行行找“失敗”兩個(gè)字。
同事建議他試試colorama這個(gè)庫(kù)。能讓成功顯示成綠色,失敗顯示成紅色,一眼就能看出來(lái)問(wèn)題出在哪。
colorama是誰(shuí)?為什么需要它?
colorama是一個(gè)極其簡(jiǎn)單的Python第三方庫(kù),核心就干一件事:讓你的命令行打印出彩色的字。它不需要依賴任何別的庫(kù),裝上去就能用。
“命令行這不一直支持顏色嗎?”你可能會(huì)問(wèn)。問(wèn)題沒(méi)這么簡(jiǎn)單。
Linux和Mac的終端天生支持顏色,直接在字符串里加幾個(gè)特殊轉(zhuǎn)義符就行。但在Windows的命令提示符和舊版PowerShell里,你不做點(diǎn)什么,這些轉(zhuǎn)義字符直接原樣輸出給你看——屏幕上出現(xiàn)一堆像\033[31msome red text這樣亂七八糟的東西,而不是紅色的文字。
colorama的價(jià)值就在這里。它幫你自動(dòng)識(shí)別你用的是什么系統(tǒng)。Windows用戶調(diào)用一下初始化,colorama會(huì)自動(dòng)把顏色代碼轉(zhuǎn)換成合適的Win32 API調(diào)用;你代碼不用動(dòng),在Linux、Mac和Windows上都能正常顯示顏色。你只用寫一套代碼,到處都能跑出漂亮的效果。
安裝它,只需要一行:
pip install colorama
跨平臺(tái)的兼容性,colorama支持的Python版本也覆蓋得很全:3.9、3.10、3.11、3.12、3.13,還有PyPy 3.11都在支持范圍內(nèi)。版本0.4.6之后對(duì)Python 3.12的兼容性也都完善了。
最簡(jiǎn)單的用法:Fore, Back, Style
colorama提供了三個(gè)核心類:
- Fore:控制文字的顏色
- Back:控制文字的背景色
- Style:控制文字的樣式(加粗、變暗、高亮等)
舉個(gè)最簡(jiǎn)單的例子,你要打印一個(gè)字“小紅”,讓他顯示成紅色的:
from colorama import init, Fore, Back, Style init() print(Fore.RED + "hello, red world") print(Back.GREEN + "這是綠色的背景") print(Style.BRIGHT + "這是高亮/加粗的文字")
這里可以看到一個(gè)小細(xì)節(jié),Fore.RED、Back.GREEN這些常量本質(zhì)上是一些“控制代碼”的包裝。把它們和普通字符串用+拼接在一起,然后再傳給print()去打印,終端遇到這些代碼時(shí)就知道“紅色文字從這里開始”。但所有顏色常量都要用英文大寫來(lái)寫。
顏色做完別忘了關(guān)燈:你可能會(huì)踩的坑
你可能會(huì)想當(dāng)然地以為,上面印完Fore.RED + "hello"之后,再打一句print("world")會(huì)自動(dòng)恢復(fù)默認(rèn)。但現(xiàn)實(shí)是很無(wú)情的。如果你直接敲進(jìn)命令行,你會(huì)發(fā)現(xiàn)后面的文字依然是紅色的。因?yàn)樵诮K端看來(lái),cmd.exe不是聰明人,你不說(shuō)停止它就永遠(yuǎn)保持幫你設(shè)的那個(gè)顏色參數(shù)。
print(Fore.RED + "這段話是紅色的")
print("這段話也偷偷變成奇怪的顏色了??")第二個(gè)print會(huì)繼承上一個(gè)print設(shè)置的狀態(tài),輸出也是紅色的。你可能會(huì)覺(jué)得這樣還行,用紅色記錄警告,但下一條可讀性就很差了。更麻煩的是,你正在編寫的復(fù)雜項(xiàng)目中可能會(huì)不小心讓異常報(bào)錯(cuò)也跟著變成全紅,大大降低代碼查閱的愉悅感。這時(shí)候你需要做一件事:強(qiáng)制把顏色恢復(fù)回來(lái)。
手動(dòng)重置顏色的方式是:
print(Fore.RED + "紅色的文字" + Fore.RESET)
print("現(xiàn)在恢復(fù)正常顏色了")不過(guò)這只重置了前景的顏色,背景色和亮度風(fēng)格還沒(méi)回去,保險(xiǎn)一些的完全重置要靠Style.RESET_ALL。
但代碼里到處加+ Style.RESET_ALL很累人。更省力的辦法用到init(autoreset=True):
from colorama import init, Fore
init(autoreset=True)
print(Fore.RED + "紅色的文字")
print("自動(dòng)恢復(fù)默認(rèn)顏色,不用操心")設(shè)置里autoreset=True意味著每行內(nèi)所有顏色變化在call最后一步時(shí)都會(huì)自動(dòng)執(zhí)行重置命令,不干擾后面的代碼。
實(shí)戰(zhàn)例子:讓登錄日志“一目了然”
回到小張的登錄測(cè)試腳本。原來(lái)的版本是這樣的:
results = [
("user1", "登錄成功"),
("user2", "登錄失敗 - 密碼錯(cuò)誤"),
("user3", "登錄成功"),
("user4", "登錄成功"),
("user5", "登錄失敗 - 賬戶鎖定"),
]
for user, status in results:
print(f"{user}: {status}")在色彩的世界里,我們可以改寫東西:
from colorama import init, Fore
init(autoreset=True)
for user, status in results:
if "成功" in status:
color = Fore.GREEN
else:
color = Fore.RED
print(f"{user}: {color}{status}")這么一改,輸出調(diào)試瞬間一目了然。init(autoreset=True)確保每個(gè)print內(nèi)部的顏色設(shè)定不會(huì)影響到下一行,后方的不同行不會(huì)意外變色了。
假如一段log同時(shí)用到前景、背景和高亮加粗,可以組合顏色樣式可以:
print(Fore.YELLOW + Back.BLUE + Style.BRIGHT + "關(guān)鍵日志" + Style.RESET_ALL)
print("后續(xù)執(zhí)行指令恢復(fù)了")這種組合可以產(chǎn)生醒目的提醒旗幟,讓系統(tǒng)日志在復(fù)雜調(diào)試?yán)镆荒苛巳弧?/p>
從頭到腳說(shuō)完整個(gè)顏色表
colorama支持的全部顏色在這里:
- 紅色、綠色、黃色、藍(lán)色
- 洋紅色(MAGENTA)、青色(CYAN)、白色、黑色
- 保留預(yù)設(shè)的顏色變淡的DEFAULT(還原回系統(tǒng)默認(rèn))
前景色(Fore): Fore.RED, Fore.GREEN, Fore.YELLOW, Fore.BLUE, Fore.MAGENTA, Fore.CYAN, Fore.WHITE, Fore.BLACK 背景色(Back): 對(duì)應(yīng)紅/綠/黃/藍(lán)/洋紅/青/白/黑等8種顏色 文字樣式(Style): Style.DIM(變暗), Style.NORMAL(常規(guī)), Style.BRIGHT(高亮/加粗)
大部分普通應(yīng)用只需要這三種,8種顏色已經(jīng)足夠滿足八成場(chǎng)景的需求。
進(jìn)階技巧:高亮特定單詞
你也可能只想把句子里的某個(gè)關(guān)鍵單詞特殊標(biāo)記。比如一行錯(cuò)誤日志,只把“ERROR”涂紅,其余文字保持默認(rèn)。
實(shí)現(xiàn)這種局部著色有很多手段。假定有一個(gè)固定詞需要高亮,可以用replace()把目標(biāo)詞包上顏色控制符:
from colorama import init, Fore
init(autoreset=True)
def highlight_word(text, word, color):
colored_word = color + word + Fore.RESET
return text.replace(word, colored_word)
log = "ERROR: Here comes some problem about file path"
print(highlight_word(log, "ERROR", Fore.RED))這樣實(shí)現(xiàn)起來(lái)代碼干凈,也好維護(hù)。
使用colorama沒(méi)有正確初始化??jī)煞N通用做法
前面提到終端的彩色打印需要調(diào)用init()。關(guān)于初始化的調(diào)用方式,有兩個(gè)主流用法:
init(autoreset=True):適合不想手動(dòng)多次Reset的情況,每次顏色都會(huì)有效分隔開;init(convert=True, autoreset=True):顯式打開ANSI轉(zhuǎn)Win32轉(zhuǎn)換,對(duì)某些老舊Windows環(huán)境更可靠。
其實(shí)在較新的colorama 0.4.6版本中,init()會(huì)自動(dòng)檢測(cè)系統(tǒng)環(huán)境,在大部分情況下直接init(autoreset=True)就夠用了。
但在公司復(fù)雜的內(nèi)部環(huán)境(非標(biāo)準(zhǔn)IDE的嵌入式終端)或者服務(wù)器集群測(cè)試情況下,有時(shí)色彩依然出不來(lái)的癥狀,可以試試一個(gè)更健壯的初始化方法——使用just_fix_windows_console()函數(shù),專門解決Windows終端顏色穿透問(wèn)題。這個(gè)函數(shù)比舊版的init()更可靠。
一個(gè)漂亮的控制臺(tái)進(jìn)度條
命令行工具繞不開的一個(gè)功能就是進(jìn)度條。一個(gè)傳統(tǒng)的進(jìn)度條往往蒼白無(wú)趣,但配合colorama,你可以把進(jìn)度條打扮得專業(yè)又不刺眼:
import time
from colorama import init, Fore, Style
init(autoreset=True)
def colored_progress_bar(percent):
bar_length = 50
filled = int(bar_length * percent)
if percent < 0.3:
bar_color = Fore.RED
elif percent < 0.7:
bar_color = Fore.YELLOW
else:
bar_color = Fore.GREEN
bar = '█' * filled + '-' * (bar_length - filled)
print(f"\r進(jìn)度:[{bar_color}{bar}{Style.RESET_ALL}] {percent*100:.1f}%", end="", flush=True)
for i in range(101):
colored_progress_bar(i/100)
time.sleep(0.05)
print()如果制作更復(fù)雜的色彩主題,還可以通過(guò)Python的類封裝來(lái)統(tǒng)一管理。
高級(jí)整合:Colorama不要單打獨(dú)斗
有的項(xiàng)目打印內(nèi)容復(fù)雜、組合靈活,想要各種前置方便切換時(shí)可能會(huì)想:如果每一個(gè)print前面都要加Fore.RED、Back.CYAN、Style.BRIGHT這么多代碼,好復(fù)雜。其實(shí)完全可以colorama和termcolor一起工作。先初始化colorama讓它保障跨平臺(tái)轉(zhuǎn)換,再用termcolor.colored()簡(jiǎn)化色彩定義:
from colorama import init
init()
from termcolor import colored
print(colored('出錯(cuò)了!', 'red', 'on_white', attrs=['reverse']))簡(jiǎn)簡(jiǎn)單單。colorama像是一個(gè)翻譯器,專門負(fù)責(zé)在Windows系統(tǒng)內(nèi)消化Windows看不懂的ANSI指令。高級(jí)樣式包裝可以按組合招來(lái),為彩色文本帶來(lái)動(dòng)態(tài)視覺(jué)感。
當(dāng)顏色真的出不來(lái)了:快速排查指南
可能在某個(gè)環(huán)境下你的代碼意外輸出了[31m文字,而不是彩色內(nèi)容。直接排查思路:
- **檢查是否調(diào)用了init()**:
init(autoreset=True)這一行得寫在所有打印顏色之前 - 升級(jí)colorama:有些環(huán)境太舊的話用
pip install --upgrade colorama解決 - 手動(dòng)檢測(cè)終端交互的限制:在某些純文本重定向場(chǎng)景,顏色代碼會(huì)被系統(tǒng)扔掉。用
sys.stdout.isatty()檢測(cè)當(dāng)前是否終端環(huán)境 - 確認(rèn)不是特殊IDE限制:有的IDE集成了對(duì)ANSI支持的設(shè)置需要手動(dòng)開啟
- 用直接方法驗(yàn)證兼容性:試運(yùn)行非常簡(jiǎn)單的
print(Fore.RED + "測(cè)試" + Style.RESET_ALL),看終端支不支持 - 跨平臺(tái)注意:某些Windows的PowerShell 5.1等舊版本需要用戶手動(dòng)啟用ANSI支持
- 換兼容的現(xiàn)代終端:如果是Windows建議使用
Windows Terminal、Visual Studio Code的內(nèi)建終端,它們對(duì)ANSI原生支持的認(rèn)可度極高。
代碼入庫(kù)的適用場(chǎng)合
colorama就像你的老朋友一樣小巧玲瓏。推薦它用在簡(jiǎn)單腳本里、監(jiān)控日志明顯標(biāo)記時(shí),任何需要從大量輸出里快速提取關(guān)鍵信息的地方都值得用起來(lái)。簡(jiǎn)潔的管理方法,明確的自定義顏色方案,讓測(cè)試和調(diào)試事半功倍。追求更高級(jí)效果——例如渲染表格、實(shí)時(shí)進(jìn)度條、終端圖表——可以嘗試rich這種豐富庫(kù),但在大部分彩色場(chǎng)景和跨平臺(tái)潤(rùn)色上,我還是愿意選干干凈凈的colorama。
本質(zhì)上colorama的核心理念是:讓色彩不干擾你的邏輯,而你的邏輯不再被無(wú)色彩的“失敗的搜索”淹沒(méi)在沉默里。給字符串加點(diǎn)顏色是小事,但正是這些小事的積累,讓終端上的交互和問(wèn)題追蹤變得直觀而優(yōu)雅。
小張搞明白了以后,跑去跟領(lǐng)導(dǎo)演示新版本的登錄測(cè)試腳本運(yùn)行結(jié)果。紅色的“失敗”大老遠(yuǎn)就能看到,綠色的“成功”如同一串綠燈順利跑完。領(lǐng)導(dǎo)說(shuō)了一個(gè)字:好。
以上就是在Python中使用colorama庫(kù)給輸出添加顏色的詳細(xì)內(nèi)容,更多關(guān)于Python colorama輸出添加顏色的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python的進(jìn)制轉(zhuǎn)換和ASCLL轉(zhuǎn)換你了解嗎
這篇文章主要為大家詳細(xì)介紹了Python的進(jìn)制轉(zhuǎn)換和ASCLL轉(zhuǎn)換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02
TensorFlow神經(jīng)網(wǎng)絡(luò)構(gòu)造線性回歸模型示例教程
這篇文章主要為大家介紹了TensorFlow構(gòu)造線性回歸模型示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
python進(jìn)階學(xué)習(xí)實(shí)時(shí)目標(biāo)跟蹤示例詳解
這篇文章主要為大家介紹了python進(jìn)階學(xué)習(xí)實(shí)時(shí)目標(biāo)跟蹤示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
PyQt5使用QTimer實(shí)現(xiàn)電子時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了PyQt5使用QTimer實(shí)現(xiàn)電子時(shí)鐘,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
Python實(shí)現(xiàn)網(wǎng)絡(luò)自動(dòng)化eNSP
這篇文章主要介紹了Python實(shí)現(xiàn)網(wǎng)絡(luò)自動(dòng)化eNSP,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05

