代码之家  ›  专栏  ›  技术社区  ›  danben

在Python的同一进程中捕获stdout

  •  6
  • danben  · 技术社区  · 16 年前

    email 模块来生成电子邮件。

    到目前为止,我的想法是:

    • 绕过所有这些,将输出通过管道传输到sendmail(但是如果我还想附加文件,这可能会很困难)
    4 回复  |  直到 16 年前
        1
  •  4
  •   Noufal Ibrahim    16 年前

    print sys.stdout 用一个 StringIO.StringIO .getValue 你的方法 StringIO 系统标准输出

    这是一种便宜的方法。我建议您使用 logging 模块。你将有更多的控制它如何做它的输出,你也可以更容易地控制它。

        2
  •  14
  •   Gary Robinson    16 年前

    import sys, StringIO, contextlib
    
    class Data(object):
        pass
    
    @contextlib.contextmanager
    def capture_stdout():
        old = sys.stdout
        capturer = StringIO.StringIO()
        sys.stdout = capturer
        data = Data()
        yield data
        sys.stdout = old
        data.result = capturer.getvalue()
    

    用法:

    with capture_stdout() as capture:
        print 'Hello'
        print 'Goodbye'
    assert capture.result == 'Hello\nGoodbye\n'
    
        3
  •  8
  •   None    16 年前

    捕获输出非常简单。

    import sys, StringIO
    old_stdout = sys.stdout
    capturer = StringIO.StringIO()
    sys.stdout = capturer
    #call functions
    print "Hi"
    #end functions
    sys.stdout = old_stdout
    output = capturer.getvalue()
    
        4
  •  2
  •   Alex Hall    10 年前

    我修改了加里·罗宾逊的答案 stdout 始终恢复,即使出现异常:

    import sys, StringIO, contextlib
    
    class Data(object):
        pass
    
    @contextlib.contextmanager
    def capture_stdout():
        old = sys.stdout
        capturer = StringIO.StringIO()
        data = Data()
        try:
            sys.stdout = capturer
            yield data
        finally:
            sys.stdout = old
            data.result = capturer.getvalue()