Refine FAQ entry for catching stdout

This commit is contained in:
Antoine Pitrou 2011-12-03 22:35:31 +01:00
parent 48383bfc67
commit d4ddec5988
1 changed files with 15 additions and 6 deletions

View File

@ -142,21 +142,30 @@ this object to :data:`sys.stdout` and :data:`sys.stderr`. Call print_error, or
just allow the standard traceback mechanism to work. Then, the output will go
wherever your ``write()`` method sends it.
The easiest way to do this is to use the StringIO class in the standard library.
The easiest way to do this is to use the :class:`io.StringIO` class::
Sample code and use for catching stdout:
>>> import io, sys
>>> sys.stdout = io.StringIO()
>>> print('foo')
>>> print('hello world!')
>>> sys.stderr.write(sys.stdout.getvalue())
foo
hello world!
>>> class StdoutCatcher:
A custom object to do the same would look like this::
>>> import io, sys
>>> class StdoutCatcher(io.TextIOBase):
... def __init__(self):
... self.data = ''
... self.data = []
... def write(self, stuff):
... self.data = self.data + stuff
... self.data.append(stuff)
...
>>> import sys
>>> sys.stdout = StdoutCatcher()
>>> print('foo')
>>> print('hello world!')
>>> sys.stderr.write(sys.stdout.data)
>>> sys.stderr.write(''.join(sys.stdout.data))
foo
hello world!