如何判断Python脚本的调用场景并实现条件化输出着色?
实现Python脚本的条件终端着色输出
你的问题核心是当脚本输出被其他程序捕获时(比如Shell的$(...)语法),需要禁用ANSI颜色控制码,只输出纯文本内容。解决思路是判断标准输出是否连接到交互式终端,再决定是否添加着色代码。
实现方案
Python的sys.stdout.isatty()方法可以检测当前标准输出是否是终端设备:
- 返回
True:脚本直接在终端运行,输出带颜色 - 返回
False:输出被重定向或捕获,输出纯文本
修改后的Message.py代码
import sys def error(message): color_code = "\033[91m" if sys.stdout.isatty() else "" reset_code = "\033[00m" if sys.stdout.isatty() else "" print(f"{color_code}{message}{reset_code}") def warning(message): color_code = "\033[93m" if sys.stdout.isatty() else "" reset_code = "\033[00m" if sys.stdout.isatty() else "" print(f"{color_code}{message}{reset_code}") def info(message): color_code = "\033[96m" if sys.stdout.isatty() else "" reset_code = "\033[00m" if sys.stdout.isatty() else "" print(f"{color_code}{message}{reset_code}") def success(message): color_code = "\033[92m" if sys.stdout.isatty() else "" reset_code = "\033[00m" if sys.stdout.isatty() else "" print(f"{color_code}{message}{reset_code}")
优化版本(代码复用)
如果想减少重复代码,可以把着色逻辑封装成工具函数:
import sys def get_colored_text(message, color_code): if sys.stdout.isatty(): return f"{color_code}{message}\033[00m" return message def error(message): print(get_colored_text(message, "\033[91m")) def warning(message): print(get_colored_text(message, "\033[93m")) def info(message): print(get_colored_text(message, "\033[96m")) def success(message): print(get_colored_text(message, "\033[92m"))
效果验证
- 直接运行脚本:终端会显示带对应颜色的消息
- 在Shell脚本中用
result=$(python GetOs.py)获取输出:$result的值是纯文本(比如"Ubuntu"),不含任何ANSI控制码,此时做相等判断if [ "$result" = "Ubuntu" ]就能正常生效。
内容的提问来源于stack exchange,提问作者Fatemeh motlagh
相关产品推荐
相关产品推荐

