3

I'm capturing the stderr of my script to I can later save to a database via:

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

# do stuff

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

Unfortunately, this makes casual debugging more difficult because if any errors occur, I won't see them until the script terminates.

How do I capture stderr in a string, as I'm doing above, but still display it in realtime to the console?

Cerin
  • 60,957
  • 96
  • 316
  • 522

1 Answers1

3

Use a file-like object that both saves and prints out to regular stderr. Something like:

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

You might need to support things like closed, flush, etc as well, depending on what happens in #do stuff. This might be easier if you inherited from StringIO.

Danica
  • 28,423
  • 6
  • 90
  • 122