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 == " " : 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(" ")的方式。