如何从Python函数调用中捕获stdout输出?

  • 回答 (2)
  • 关注 (0)
  • 查看 (82)

我正在使用Python库对对象做一些事情

do_something(my_object)

并改变它。在这样做的时候,它会打印一些统计数据到stdout,我想了解一下这些信息。正确的解决办法是改变do_something()要返回相关信息,

out = do_something(my_object)

不过,还得等一段时间do_something()讨论这个问题。作为一种解决办法,我考虑过解析任何东西。do_something()写到stdout。

如何捕获代码中两点之间的标准输出,例如,

start_capturing()
do_something(my_object)
out = end_capturing()

?

此昵称已隐藏_此昵称已隐藏_提问于
特殊枪的潘鬼鬼前端开发回答于
已采纳

试试这个上下文管理器:

from cStringIO import StringIO
import sys

class Capturing(list):
    def __enter__(self):
        self._stdout = sys.stdout
        sys.stdout = self._stringio = StringIO()
        return self
    def __exit__(self, *args):
        self.extend(self._stringio.getvalue().splitlines())
        del self._stringio    # free up some memory
        sys.stdout = self._stdout

用法:

with Capturing() as output:
    do_something(my_object)

output现在是包含函数调用打印的行的列表。

高级用途:

可能不明显的是,这可以不止一次地完成,结果相互关联:

with Capturing() as output:
    print 'hello world'

print 'displays on screen'

with Capturing(output) as output:  # note the constructor argument
    print 'hello world2'

print 'done'
print 'output:', output

产出:

displays on screen                     
done                                   
output: ['hello world', 'hello world2']
倒地输出回答于

在python>=3.4中,contextlib包含一个redirect_stdout装饰师。它可以用来回答你的问题如下:

import io
from contextlib import redirect_stdout

f = io.StringIO()
with redirect_stdout(f):
    do_something(my_object)
out = f.getvalue()

从文档:

用于将sys.stdout临时重定向到另一个文件或类似文件的对象的上下文管理器。 该工具为输出硬连接到stdout的现有函数或类增加了灵活性。 例如,Help()的输出通常被发送到sys.stdout。通过将输出重定向到io.StringIO对象,可以捕获字符串中的输出: f=io.StringIO()带有重定向_stdout(F):Help(Pow)s=f.getvalue() 若要将Help()的输出发送到磁盘上的文件,请将输出重定向到常规文件: 使用open(‘hel.txt’,‘w’)作为f:具有重定向_标准(F):帮助(POW) 若要将Help()的输出发送到sys.stderr,请执行以下操作: 重定向_stdout(sys.stderr):帮助(POW) 注意,sys.stdout的全局副作用意味着这个上下文管理器不适合在库代码和大多数线程应用程序中使用。它也不影响子进程的输出。但是,对于许多实用程序脚本来说,它仍然是一种有用的方法。 此上下文管理器是可重入的。

扫码关注云+社区

领取腾讯云代金券