3.4.6 重定向输出流
设计不当的库代码可能会直接写sys.stdout或sys.stderr,而没有提供参数来配置不同的输出目标。可以用redirect_stdout()和redirect_stderr()上下文管理器从这些函数捕获输出,因为无法修改这些函数的源代码来接受新的输出参数。
from contextlib import redirect_stdout,redirect_stderr
import io
import sys
def misbehaving_function(a):
sys.stdout.write('(stdout) A:{!r}\n'.format(a))
sys.stderr.write('(stderr) A:{!r}\n'.format(a))
capture = io.StringIO()
with redirect_stdout(capture),redirect_stderr(capture):
misbehaving_function(5)
print(capture.getvalue())
在这个例子中,misbehaving_function()同时写至stdout和stderr,不过两个上下文管理器将这个输出发送到同一个io.StringIO实例,会在这里保存以备以后使用。
运行结果:
(stdout) A:5
(stderr) A:5