Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Capturing stdout within the same process in Python

Tags:

python

stream

I've got a python script that calls a bunch of functions, each of which writes output to stdout. Sometimes when I run it, I'd like to send the output in an e-mail (along with a generated file). I'd like to know how I can capture the output in memory so I can use the email module to build the e-mail.

My ideas so far were:

  • use a memory-mapped file (but it seems like I have to reserve space on disk for this, and I don't know how long the output will be)
  • bypass all this and pipe the output to sendmail (but this may be difficult if I also want to attach the file)
like image 779
danben Avatar asked Apr 16 '10 17:04

danben


2 Answers

I modified None's answer to make it a context manager:

import sys, StringIO, contextlib

class Data(object):
    pass

@contextlib.contextmanager
def capture_stdout():
    old = sys.stdout
    capturer = StringIO.StringIO()
    sys.stdout = capturer
    data = Data()
    yield data
    sys.stdout = old
    data.result = capturer.getvalue()

Usage:

with capture_stdout() as capture:
    print 'Hello'
    print 'Goodbye'
assert capture.result == 'Hello\nGoodbye\n'
like image 175
Gary Robinson Avatar answered Nov 15 '22 09:11

Gary Robinson


It's pretty simple to capture output.

import sys, StringIO
old_stdout = sys.stdout
capturer = StringIO.StringIO()
sys.stdout = capturer
#call functions
print "Hi"
#end functions
sys.stdout = old_stdout
output = capturer.getvalue()
like image 8
None Avatar answered Nov 15 '22 09:11

None