为后期重播捕获标准的明智方法?

时间:2011-09-09 19:17:00

标签: python stream mocking stdout

作为尝试测试遗留功能的'print to stdout'副作用的一部分,我想捕获stdout以便以后重播。我使用mock

目标(尽可能多地实现!)

  • stdout仍会打印正常情况,但还有一个额外的记录器
  • 理想情况下,这应该是“修补”或仅发生在上下文中

我的实现(下面)有修补,看起来有点重/粗。有更健全的方法吗? cStringIO?我可以使用mock的任何更好的部分,而不是我的__getattr__黑客?

class StreamCapturing(object):
    def __init__(self, stream):
        self.captured = []
        self.stream = stream

    def __getattr__(self,attr):
        return getattr(self.stream,attr)

    def write(self, data):
        self.captured.append(data)
        self.stream.write(data)


import sys
import mock
with mock.patch('sys.stdout',StreamCapturing(sys.stdout)) as ctx:
    sys.stdout.write('a\n')
    print 'stdout'
    sys.__stdout__.write("the real one\n")
    print sys.stdout.captured
    sys.stdout.flush()

assert getattr(sys.stdout,'captured') is None

2 个答案:

答案 0 :(得分:2)

你甚至不需要保存以前的stdout python为你做的事情,是的,使用cStringIO

import sys
from cStringIO import StringIO

sys.stdout = captured = StringIO()
print "test string"
# test stuff
captured = captured.getvalue()
sys.stdout = sys.__stdout__
print "captured",captured

答案 1 :(得分:0)

在这种情况下你不需要模拟:

saved_stdout = sys.stdout
sys.stdout = StreamCapturing(saved_stdout)

print "stdout"

captured = "".join(sys.stdout.captured)
sys.stdout=saved_stdout
print "captured: ", captured