You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:05:05