stdout_redirect
What?
A Python library to collect and redirect code from stdout (and/or stderr) and collect it into program-accessible locations.
Tested and working on Linux, Mac OS, and Windows!
How?
pip install -U stream-redirect
from stream_redirect import Redirect
r = Redirect(stdout=True, stderr=True)
with r:
print("This will be captured")
os.system("echo This will also be captured")
some_c_module.method_that_writes("This willl be, too")
print("Captured stdout: ", r.stdout)
print("Captured stderr: ", r.stderr)
Construction
Redirect accepts three arguments:
stdout
- Default True. Capture stdout to the "stdout" propertystderr
- Default False. Capture stderr to the "stderr" propertypython_only
- Default False. Only capture the output of Python code and not the output of system calls and C libraries. This behavior mimics the built in context manager (discussed below) and is useful when you just want to drop in this to replace that one in versions of Python where it doesn't exist
Usage
If you only want to silence output you can do
with Redirect():
pass
However, if you wish to inspect the results of the run, you need to create and read
the context manager outside of the with
invocation, as the object created during
the call is only accessible within the body of the with
block.
Why?
Isn't there already a standard module for this?
It's true that the standard library includes a context decorator that already redirects stdout for most normal uses. But this is not sufficient. It fails on at least a few scenarios.
It is new
The built-in module won't help you on Python 2.7 or Python 3.0-3.3 (where it does not exist).
This module will do so
It doesn't capture system calls
The above module doesn't capture system calls
In [1]: import io, os, contextlib
In [2]: s = io.StringIO()
In [3]: with contextlib.redirect_stdout(s):
...: os.system("echo Hello world")
...:
Hello world
In [4]: print("Captured output: ", s.getvalue())
Captured output:
This module will do so
It doesn't capture output from the C library
If an extension module written in C writes output, the built-in context wrapper will not capture it.
This module will do so