
本文介绍一种基于 ANSI 转义序列的轻量级方案,通过 change_color() 函数统一控制后续所有 print() 输出的颜色,避免逐行添加格式代码,兼容大多数现代终端(Windows Terminal、iTerm2、Linux TTY 等)。
本文介绍一种基于 ansi 转义序列的轻量级方案,通过 `change_color()` 函数统一控制后续所有 `print()` 输出的颜色,避免逐行添加格式代码,兼容大多数现代终端(windows terminal、iterm2、linux tty 等)。
要实现“一次调用、全局生效”的终端文本着色效果(如 change_color("red") 后所有 print() 输出自动变为红色),核心在于重写 print() 行为或封装输出逻辑。由于 Python 原生 print() 不支持动态颜色状态,最简洁可靠的方案是:定义一个受控的 print_colored() 函数,并配合全局颜色状态管理——这正是本教程推荐的专业实践方式。
以下是一个完整、可直接运行的解决方案:
class TextColor:
RESET = "\033[0m" # 重置所有样式
RED = "\033[31m" # 前景色:红色
GREEN = "\033[32m" # 前景色:绿色
YELLOW= "\033[33m"
BLUE = "\033[34m"
PURPLE= "\033[35m"
CYAN = "\033[36m"
WHITE = "\033[37m"
# 全局当前颜色状态(初始为重置)
_current_color = TextColor.RESET
def change_color(color: str) -> None:
"""设置后续 print_colored() 的默认前景色"""
global _current_color
color_map = {
"red": TextColor.RED,
"green": TextColor.GREEN,
"yellow": TextColor.YELLOW,
"blue": TextColor.BLUE,
"purple": TextColor.PURPLE,
"cyan": TextColor.CYAN,
"white": TextColor.WHITE,
}
_current_color = color_map.get(color.lower(), TextColor.RESET)
if _current_color == TextColor.RESET:
print(f"⚠️ 警告:未知颜色 '{color}',已恢复默认")
def print_colored(*args, **kwargs) -> None:
"""增强版 print:自动应用当前颜色,并确保结尾重置"""
text = " ".join(str(arg) for arg in args)
# 使用 end 参数兼容原生 print 行为(如 end="\n" 或 end="")
end = kwargs.pop("end", "\n")
print(_current_color + text + TextColor.RESET, end=end, **kwargs)
# ✅ 使用示例
change_color("red")
print_colored("Hello world!")
print_colored("Hi world")
change_color("green")
print_colored("Hello world!")
print_colored("Hi world!")? 关键说明:
- 此方案不修改内置 print(),因此安全、无副作用,适合集成到现有项目;
- 所有颜色均使用标准 ANSI 3-bit 前景色码(\033[3Xm),跨平台兼容性好(Windows 10/11 默认启用 ANSI 支持;若旧版 CMD 失效,请先执行 os.system('') 激活或改用 colorama.init());
- print_colored() 完全兼容原生 print() 的参数(如 sep, end, file),可无缝替换;
- 颜色自动重置(TextColor.RESET)防止后续输出被意外染色,是健壮性的关键保障。
⚠️ 注意事项:
立即学习“Python免费学习笔记(深入)”;
- 在某些 IDE 内置终端(如 PyCharm 默认终端、VS Code 的旧版集成终端)中,ANSI 支持可能受限。建议在外部终端(Windows Terminal、Terminal.app、GNOME Terminal)中验证效果;
- 如需背景色、加粗、下划线等高级样式,可扩展 TextColor 类(例如 BOLD = "\033[1m");
- 若必须劫持原生 print(),可通过 builtins.print = print_colored 实现,但会带来调试复杂度与潜在风险,不推荐在生产环境使用。
总结:与其依赖系统命令(如 os.system('color a'),其行为高度依赖 Windows 控制台模式且不可移植),不如采用标准化 ANSI 方案——它轻量、可控、可维护,真正实现“一处设置、多行生效”的开发效率目标。


















