BaRud Asked: 2025-04-17 11:34:23 +0800 CST2025-04-17 11:34:23 +0800 CST 2025-04-17 11:34:23 +0800 CST 更改终端的 stdio/stderr 字体颜色 772 我正在使用深色主题。正如您所见,错误(来自 Python 的 ModuleNotFound)几乎无法阅读。我有两个问题。 这个颜色是由 python 还是终端控制的? 如何更改颜色?是否有任何 LS_COLOR 设置? terminal 1 个回答 Voted Best Answer grawity 2025-04-17T12:47:26+08:002025-04-17T12:47:26+08:00 这个颜色是由 python 还是终端控制的? 两者:Python从“标准” 8/16 色调色板中选择一种通用调色板颜色,终端的配置控制特定的色调。 例如,Python 输出\033[35m选择前景色#5,这通常表示“某种洋红色”,但不同的终端对“洋红色”有不同的默认值 - 并且通常有大量预定义方案可供选择。 “上方” 8 种颜色通常是“下方”颜色的明亮版本(……Solarized 主题除外)。有一些特定的代码可以使用它们(例如,95用于亮洋红色),但许多终端也会隐式地将粗体文本视为亮色,因为最初这是硬件 CRT 终端在其固定字体中处理“强”颜色的唯一方法。因此,当 Python 使用\033[1;35m“粗洋红色”时,这可能是颜色 #5 或颜色 #13。 程序也可以使用 256 色调色板(6×6×6),这种调色板更加固定,在不同终端之间几乎没有差异,但默认情况下很少使用,因为很难确定终端是否支持它(以及它是否支持标准语法,还是仅仅支持事实上的“误解标准”语法)。直接色 RGB 也是如此,大多数终端都支持它,但很少有程序使用它。 标准输出 (stdout) 和标准错误 (stderr) 的颜色选择并非单独设置。当信息到达终端时,stdout 和 stderr 之间不再有任何区别:两者通过同一管道(tty 设备)混合到达,因此终端无法自行应用不同的颜色。 #!/usr/bin/env bash # showcolors -- Display the 16 basic terminal colors. for y in 30 90; do (( y == 30 )) || printf "\n" for x in {0..7}; do fx=$[y+x] bx=$[10+y+x] printf "%-9s" "Color $fx:" printf " \e[2;%dm%s\e[m" $fx "Dimmed" printf " \e[%dm%s\e[m" $fx "Normal" printf " \e[1;%dm%s\e[m" $fx "Strong" printf " " printf " \e[%dm%s\e[m" $bx " Normal " printf " \e[1;%dm%s\e[m" $bx " Strong " printf " " printf " \e[30;%dm%s\e[m" $bx " Normal " printf " \e[1;30;%dm%s\e[m" $bx " Strong " printf "\n" done done 如何更改颜色?是否有任何 LS_COLOR 设置? 程序输出的颜色代码可能可自定义,也可能不可自定义。例如,dmesg请查看 Terminal-colors.d(5)。 许多程序(包括 Python)都支持NO_COLOR=1关闭所有输出颜色的变量。(对于正常使用来说,这有点过头了,但遗憾的是目前还没有SENSIBLE_AMOUNT_OF_COLOR。) Python 支持使用PYTHON_COLORS环境变量禁用颜色,但不支持自定义颜色——它Lib/traceback.py被硬编码为使用“粗体洋红色”,根据终端的不同,它可能是颜色#5或#13。 但由于它只使用基本的 8/16 位颜色代码,因此这些颜色的具体色调可以在终端配置中设置(实际上每个终端都可以自定义,例如参见上一个链接)。如果默认的“洋红色”太暗,您可以更改它。 从技术上讲,您可以在 $PYTHONSTARTUP 脚本中覆盖Python 关于使用什么颜色代码表示“粗体洋红色”的想法,但这可能会产生令人困惑的结果,因为不能保证仅限于回溯。 import _colorize _colorize.ANSIColors.BOLD_MAGENTA = "\033[1;3;5;4;93;44m" # _colorize.ANSIColors.BOLD_MAGENTA = _colorize.ANSIColors.INTENSE_RED _colorize.ANSIColors.MAGENTA = "\033[1m" import traceback old_fn = traceback._format_final_exc_line def new_fn(etype, value, *args, **kwargs): text = old_fn(etype, value, *args, **kwargs) head, tail = text.split("\n", 1) # works in XTerm and PuTTY; doesn't work in GNOME Terminal return f"\033#3{head}\n\033#4{head}\n{tail}" traceback._format_final_exc_line = new_fn
两者:Python从“标准” 8/16 色调色板中选择一种通用调色板颜色,终端的配置控制特定的色调。
例如,Python 输出
\033[35m
选择前景色#5,这通常表示“某种洋红色”,但不同的终端对“洋红色”有不同的默认值 - 并且通常有大量预定义方案可供选择。“上方” 8 种颜色通常是“下方”颜色的明亮版本(……Solarized 主题除外)。有一些特定的代码可以使用它们(例如,
95
用于亮洋红色),但许多终端也会隐式地将粗体文本视为亮色,因为最初这是硬件 CRT 终端在其固定字体中处理“强”颜色的唯一方法。因此,当 Python 使用\033[1;35m
“粗洋红色”时,这可能是颜色 #5 或颜色 #13。程序也可以使用 256 色调色板(6×6×6),这种调色板更加固定,在不同终端之间几乎没有差异,但默认情况下很少使用,因为很难确定终端是否支持它(以及它是否支持标准语法,还是仅仅支持事实上的“误解标准”语法)。直接色 RGB 也是如此,大多数终端都支持它,但很少有程序使用它。
标准输出 (stdout) 和标准错误 (stderr) 的颜色选择并非单独设置。当信息到达终端时,stdout 和 stderr 之间不再有任何区别:两者通过同一管道(tty 设备)混合到达,因此终端无法自行应用不同的颜色。
程序输出的颜色代码可能可自定义,也可能不可自定义。例如,
dmesg
请查看 Terminal-colors.d(5)。许多程序(包括 Python)都支持
NO_COLOR=1
关闭所有输出颜色的变量。(对于正常使用来说,这有点过头了,但遗憾的是目前还没有SENSIBLE_AMOUNT_OF_COLOR
。)Python 支持使用
PYTHON_COLORS
环境变量禁用颜色,但不支持自定义颜色——它Lib/traceback.py
被硬编码为使用“粗体洋红色”,根据终端的不同,它可能是颜色#5或#13。但由于它只使用基本的 8/16 位颜色代码,因此这些颜色的具体色调可以在终端配置中设置(实际上每个终端都可以自定义,例如参见上一个链接)。如果默认的“洋红色”太暗,您可以更改它。
从技术上讲,您可以在 $PYTHONSTARTUP 脚本中覆盖Python 关于使用什么颜色代码表示“粗体洋红色”的想法,但这可能会产生令人困惑的结果,因为不能保证仅限于回溯。