3

我正在捕获脚本的标准错误,以便以后可以通过以下方式保存到数据库中:

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

# do stuff

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

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

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

4

1 回答 1

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

您可能还需要支持closed,flush等内容,具体取决于#do stuff. 如果您继承自StringIO.

于 2012-05-14T02:03:40.337 回答