python使用装饰器进行彩色打印

问题描述

| 如何装饰一个函数,使其打印到
stdout
的所有内容为绿色,而打印到
stderr
的任何内容为红色?我有可用的“ 2”模块。 奖励业力:如何将参数传递给装饰器以指定颜色,将其认设置为红色和绿色?     

解决方法

        一个有趣的问题。最简单的解决方案将类似于Pete的建议。只需在运行功能到stderr和stdout之前打印转义码。但是,如果stderr和stdout都馈入同一端子(通常是这样),则它们将相互干扰。 因此,另一种解决方案是用微型包装器在stdout和stderr上进行猴子补丁,从而在每次写入期间启用颜色,仅当我们在终端设备中(而不是通过管道传输)时,才应注意这样做。
#!/usr/bin/python2

import sys

def colorize(stdoutColor,stderrColor):
  defaultColor = \'\\033[0;0m\'

  def applyColorize(f):
    class colorWrapper(object):
      def __init__(self,wrapee,color):
        self.wrapee = wrapee
        self.color = color
      def __getattr__(self,attr):
        if attr == \'write\' and self.wrapee.isatty():
          return lambda x: self.wrapee.write(self.color + x + defaultColor)
        else:
          return getattr(self.wrapee,attr)

    def wrapper(*args,**kwds):
      oldStdout = sys.stdout
      oldStderr = sys.stderr
      sys.stdout = colorWrapper(oldStdout,stdoutColor)
      sys.stderr = colorWrapper(oldStderr,stderrColor)
      try:
        f(*args,**kwds)
      finally:
        sys.stdout = oldStdout
        sys.stderr = oldStderr

    return wrapper

  return applyColorize


greenColor = \'\\033[01;32m\'
redColor = \'\\033[01;31m\'

def foo():
  print \"I\'m ordinary and boring!\"
  print >> sys.stderr,\'Writing to stderr!\'

@colorize(greenColor,redColor)
def colorFoo():
  print \"I\'m colorful and exciting!\"
  print >> sys.stderr,\'Writing to stderr!\'

if __name__ == \'__main__\':
  foo()
  colorFoo()
  foo()
仍然可以稍微打磨一下,但是在大多数情况下它应该可以完成工作,并且可以正确地对其进行清理。当然,请记住,我正在使用特定于shell的转义代码。如果您希望具有便携性,则必须用对便携式终端控制模块的调用来替换转义代码。     ,        这适用于Mac的Terminal.app中的Bash
import sys
green = \'\\033[01;32m\'
red = \'\\033[01;31m\'

sys.stdout.write(green+\"Hello \")
sys.stderr.write(red+\"world!\")
    ,        这是我与termcolor模块的代码:
from termcolor import colored

class ColoredOutput:
    def __init__(self,org_handle,color,on_color=None,attrs=[\'bold\']):
        self.org_handle = org_handle
        def wrapper_write(x):
            return org_handle.write(colored(x,color=color,on_color=on_color,attrs=attrs))
        self.wrapper_write = wrapper_write
    def __getattr__(self,attr):
        return self.wrapper_write if attr == \'write\' else getattr(self.org_handle,attr)

if __name__ == \'__main__\':
    import sys
    import colorama   # I\'m working under windows 7,so i need this module to enable terminal color

    colorama.init()
    sys.stderr = ColoredOutput(sys.stderr,\'red\')
    print(\'This is a test string\',file=sys.stderr)