在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'