You need to enable JavaScript to run this app. Python终端彩色输出:ANSI转义码含义与HEX颜色使用咨询
优惠活动
大模型
产品
解决方案
定价
更多

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颜色转换流程

  1. 去除HEX值开头可能存在的#,得到6位十六进制字符串
  2. 按顺序拆分字符串,每两位对应一个色彩通道:前两位为红通道、中间两位为绿通道、后两位为蓝通道
  3. 将拆分得到的十六进制值转为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 17:36:09