Python终端彩色输出:ANSI转义码含义与HEX颜色使用咨询
终端控制序列格式解析与自定义HEX颜色实现
一、常见转义序列的格式与含义
你接触到的类似\033[1m的字符串,本质是ANSI/VT100标准的终端控制转义序列,整个序列可以拆成三个固定组成部分:
- 起始标记:以
\033(ASCII码为27的转义字符)开头,是所有终端控制序列的通用识别符 - 引导标识:紧跟起始标记的
[,即CSI(控制序列引入符),用于告知终端后续传入的是可执行控制指令,而非需要显示的普通文本 - 参数与功能标识:引导符之后的数字/分号组合为功能参数,末尾的单个字母为指令类型标记——你示例代码中所有序列末尾的
m,代表“设置文本的颜色、样式等图形属性”(其他常用标识如H用于光标定位、J用于清屏操作)
对应你代码中常用参数的具体含义:
0:重置所有文本样式、颜色为终端默认值(即你定义的ENDC)1:开启粗体高亮效果(即你定义的BOLD)- 30~37:设置基础8色的文本前景色
- 90~97:设置高亮版8色的文本前景色(你代码中
92m对应亮绿、93m对应亮黄、91m对应亮红等均属于这类16色基础序列,也是你觉得可用颜色有限的核心原因——这类序列仅覆盖16个固定色彩)
补充纠错:你定义的
UNDERLINE = '\033[96m'存在错误,\033[96m实际是亮青色的色彩设置,真正的下划线样式序列为\033[4m。
二、任意HEX颜色的终端设置方法
完全可以不局限于16色基础序列,直接使用任意HEX值设置终端文本颜色,前提是当前使用的终端支持24位真彩色(目前主流的Windows Terminal、macOS默认终端、Linux桌面端终端、编辑器内置终端均已默认支持该特性)。
对应的24位真彩色前景色序列格式为:\033[38;2;R;G;Bm,其中R、G、B分别为0~255区间的十进制数值,对应颜色的红、绿、蓝三通道值。
HEX颜色转换流程
- 去除HEX值开头可能存在的
#,得到6位十六进制字符串 - 按顺序拆分字符串,每两位对应一个色彩通道:前两位为红通道、中间两位为绿通道、后两位为蓝通道
- 将拆分得到的十六进制值转为0~255的十进制数,填入序列模板即可
举个实际转换示例:对HEX值#FF5733
- 拆分得到红通道
FF(转十进制为255)、绿通道57(转十进制为87)、蓝通道33(转十进制为51) - 拼接得到的可用序列为
\033[38;2;255;87;51m,输出的文本即为该HEX对应的橙红色。
Python侧简化实现
你可以写一个简易转换函数,减少手动计算的麻烦:
class bcolors: ENDC = '\033[0m' BOLD = '\033[1m' UNDERLINE = '\033[4m' def get_hex_fg(hex_color: str) -> str: hex_clean = hex_color.lstrip('#') r = int(hex_clean[0:2], 16) g = int(hex_clean[2:4], 16) b = int(hex_clean[4:6], 16) return f'\033[38;2;{r};{g};{b}m' # 实际调用示例 print(f"{get_hex_fg('#FF5733')}任意HEX颜色设置测试文本{bcolors.ENDC}")
补充说明
- 若要设置背景色而非前景色,仅需将模板中的
38替换为48即可,对应序列格式为\033[48;2;R;G;Bm - 若遇到老旧的Windows传统控制台(非Windows Terminal),默认未开启虚拟终端序列解析,即便写出正确的转义码,也可能被当成普通文本输出,需要手动开启对应系统开关才能正常生效。
内容的提问来源于stack exchange,提问作者mhhabib
相关产品推荐
相关产品推荐

