1.重定向到文件
import sys
sys.stdout = open("log.txt", "write")
“任何提供file-like write方法的对象都可以被赋给sys.stdout方法从而使得标准输出输送到该对象的write方法.”。
这种说法网上到处都是,但很少找到这样自定义的file-like write实现。前一阵子尝试了半天,总是不尽人意。因为我在做python扩展,想把python输出重定向到debugView,虽然写了个file-like
write类,可结果总是让人不爽,输出了多余的换行符。今天突然来了灵感,发现了原因。
2.重定向到自定义的file-like write对象。
例:
import sys
import Lazy
g_oldStdout = sys.stdout
g_oldStderr = sys.stderr
class Redirect(object):
def __init__(self):
self.cache = ""
self.out = Lazy.debug
def init(self) :
sys.stdout = self
sys.stderr = self
def write(self, s):
if s == "\n" :
self.out(self.cache)
self.cache = ""
else :
self.cache += s
def release(self):
global g_oldStdout, g_oldStderr
sys.stdout = g_oldStdout
sys.stderr = g_oldStderr
g_redirect = Redirect()
Lazy.debug是我封装了WindowsAPI的OutputDebugMsg函数。早期,我将write方法的内部实现直接用OutputDebugMsg输出,所以结果很悲催!!!
由于print 1, 2, 3, 4, 5并不是直接将调用stdout.write("12345")输出,而是write("1"),write("2"),write("3")...write("\n")的方式。