如何在显示时将Python Stderr重定向到字符串

时间:2012-05-14 01:56:18

标签: python

我正在捕获我的脚本的stderr,以后可以通过以下方式保存到数据库:

ostderr = sys.stderr
sys.stderr = StringIO()

# do stuff

mymodel.errors = sys.stderr.getvalue()
mymodel.save()
print mymodel.errors
sys.stderr = ostderr

不幸的是,这使得随意调试变得更加困难,因为如果发生任何错误,我将不会看到它们,直到脚本终止。

如何在字符串中捕获stderr,就像我上面所做的那样,但仍然可以实时显示给控制台?

1 个答案:

答案 0 :(得分:3)

使用类似文件的对象,同时保存并打印到常规stderr。类似的东西:

class TeeFiles(object):
    def __init__(self, file):
        self.sio = StringIO()
        self.file = file

    def write(self, txt):
        self.sio.write(txt)
        self.file.write(txt)

sys.stderr = TeeFiles(sys.stderr)

# do stuff

mymodel.errors = sys.stderr.sio.getvalue()
mymodel.save()
sys.stderr = sys.stderr.file

您可能还需要支持closedflush等内容,具体取决于#do stuff中发生的情况。如果您继承自StringIO

,这可能会更容易