在python中捕获完整标准输出

在python中捕获完整标准输出,python,redirect,stdout,Python,Redirect,Stdout,这是对以下问题的一点补充:。答案成功地将用于stdout的任何输出重定向到/dev/null。新的目标是在打印时捕获stdout,这样我就可以检查它是否存在某些字符串。这里有一个局部解决方案,每当使用类似于print或sys.stdout.write()的方法将包含“warning”的字符串打印到stdout时,就会引发MyError: 但是,它并没有在文件描述符级别重定向内容,正如在另一篇关于重定向的文章中所解释的那样 我的问题是:我能否以类似于上述代码的方式捕获到stdout的所有输出,如果

这是对以下问题的一点补充:。答案成功地将用于
stdout
的任何输出重定向到
/dev/null
。新的目标是在打印时捕获stdout,这样我就可以检查它是否存在某些字符串。这里有一个局部解决方案,每当使用类似于
print
sys.stdout.write()的方法将包含“warning”的字符串打印到
stdout
时,就会引发
MyError

但是,它并没有在文件描述符级别重定向内容,正如在另一篇关于重定向的文章中所解释的那样

我的问题是:我能否以类似于上述代码的方式捕获到stdout
的所有输出,如果找到某个字符串,就会引发错误?关键是我不想写入实际的文件(这就是为什么最初的计划是将所有内容写入
/dev/null
)。似乎使用缓冲区大小适中的“tempfile”模块可能会起作用,因为这将允许我使用
dup2()
来完全重定向内容,但这种方法没有成功

import sys
import contextlib

class Warning_Catcher():
    def write(self, string):
        if 'warning' in string:
            raise MyError

@contextlib.contextmanager
def capture_warning():
    oldout, sys.stdout = sys.stdout, Warning_Catcher()
    try:
        yield sys.stdout
    except MyError:
        # handle error
    finally:
        sys.stdout = oldout

with capture_warning() as out:
    print 'warning'