我强烈建议不要使用猴子补丁sys.stdout
,sys.stderr
这是一种不好的做法,因为它可能会破坏您正在使用的其他模块或使用您的代码的其他模块。
一种更安全的方法是使用logging模块的StreamHandler与codecs 模块的编码编写器一起将编码的消息打印到默认值stdout
或stderr
处理程序:
import logging
# import codecs # not necessary, this is embedded in logging
# import sys # not necessary, this is embedded in logging
# get your encoding flag here...
flag = 1
# Log everything, and send it to stderr.
# create an encoded streamhandler with encoding based on flag
if flag == 1:
writer = logging.codecs.getwriter('rot13')(logging.sys.stderr)
streamhandler = logging.StreamHandler(stream = writer)
else:
streamhandler = logging.StreamHandler() # defaults to unencoded stderr
# you can use sys.stdout instead,
# it depends on preference and use case
# set the log level threshold
streamhandler.setLevel(logging.DEBUG)
# create a basic logger
log = logging.getLogger()
log.setLevel(logging.DEBUG)
log.addHandler(streamhandler)
# now, instead of print, use log.debug(message)
print 'hello world'
log.debug('hello world')
使用 logging 模块的优点是它还允许您设置自己的自定义格式化程序和过滤器,以及使用以下方式获取有意义的调试消息log.exception(...)