Python通过环境变量(如$COLORTERM)和tput命令检测终端颜色支持:$COLORTERM为truecolor或24bit即支持真彩色;tput colors返回256表示256色,≥16777215且tput setaf 16777215成功则支持真彩色。

Python 可以通过检查环境变量和终端能力来判断当前是否支持 256 色或真彩色(16777216 色),但需注意:Python 本身不直接探测终端硬件能力,而是依赖标准约定(如 $TERM、$COLORTERM、$TPUT 输出等)进行合理推断。
检查关键环境变量
多数现代终端会通过环境变量声明自身颜色能力:
-
$COLORTERM:若值为truecolor或24bit,基本可确定支持真彩色;部分终端(如 kitty、alacritty、最新版 gnome-terminal、Windows Terminal)会设置它 -
$TERM:不能单独作为依据(如xterm-256color表示支持 256 色,screen-256color、tmux-256color同理),但若为xterm或vt100等无后缀值,则大概率仅支持 8/16 色 -
$TERM_PROGRAM:macOS/iTerm2 会设为iTerm.app,iTerm2 v3+ 默认启用真彩色;VS Code 终端设为vscode,新版也默认支持真彩色
调用 tput 验证终端能力(推荐)
最可靠的方式是使用系统命令 tput colors 和 tput setaf 255(或 tput setaf 16777215)试探:
-
tput colors返回数字:≤ 8 → 基本色,16 → 16 色,256 → 支持 256 色,0或报错 → 不支持颜色 -
tput setaf 255 2>/dev/null && echo "256 ok"可验证 256 色是否可用(避免因不支持而报错中断) - 真彩色无标准
tput查询方式,但可尝试tput setaf 16777215并捕获退出码;成功通常意味着真彩色就绪(注意:某些终端虽支持但未正确配置terminfo,可能失败)
在 Python 中可这样封装:
立即学习“Python免费学习笔记(深入)”;
import subprocess import osdef get_terminal_colors(): try: out = subprocess.run(['tput', 'colors'], capture_output=True, text=True, timeout=0.5) if out.returncode == 0 and out.stdout.strip().isdigit(): return int(out.stdout.strip()) except (subprocess.TimeoutExpired, FileNotFoundError, OSError): pass return 0
def supports_truecolor():
先看环境变量捷径
if os.getenv('COLORTERM') in ('truecolor', '24bit'): return True # 再试探 tput try: # 尝试设置一个高位颜色码(真彩色典型值) result = subprocess.run(['tput', 'setaf', '16777215'], capture_output=True, timeout=0.3) return result.returncode == 0 except (subprocess.TimeoutExpired, FileNotFoundError, OSError): return False使用示例
n = get_terminal_colors() # 如返回 256 或 0 is_true = supports_truecolor() # True / False
注意终端复用场景(tmux / screen)
在 tmux 或 screen 中,即使底层终端支持真彩色,会话本身可能未启用:
- tmux 需配置
set -g default-terminal "tmux-256color"(256 色)或"screen-256color",真彩色还需set -ga terminal-overrides ",xterm-256color:Tc"(启用Tccapability) - 可通过
echo $TERM在 tmux 内确认是否含-256color,再结合tput colors实际验证 - Python 程序运行在 tmux 内时,应以 tmux 的
$TERM和tput结果为准,而非宿主终端
简单 fallback 策略
不必追求 100% 准确,实用做法是“宽松检测 + 安全降级”:
- 优先信任
$COLORTERM(truecolor → 直接启用真彩色) - 其次查
tput colors ≥ 256→ 启用 256 色模式 - 否则回退到 16 色(ANSI 标准)
- 所有 ANSI 转义序列发送前,可加
os.getenv('NO_COLOR')检查(符合 no-color.org 规范)强制禁用颜色










