问题描述
|
如何装饰一个函数,使其打印到
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)