Python Use StringIO to Capture STDOUT and STDERR


When you use print() in python the output goes to standard output or sys.stdout. You can directly call sys.stdout.write() instead of using print(), but you can also completely replace sys.stdout with another stream. This example will show you how to use StringIO memory files to capture and view stdout.

As always, check the official StringIO documentation for the best information.

Use StringIO to replace stdout

This is good for testing and special cases where you may not have a terminal output. First, create the StringIO object and then replace sys.stdout with it. You can write to it directly, or when using print() it will default to going to sys.stdout and therefore go to our stream object.

To get back the original output stream, it is stored from sys.__stdout__ a special dunder that always contains the original system stdout.

from io import StringIO  # Python 3
import sys

# Create the in-memory "file"
temp_out = StringIO()

# Replace default stdout (terminal) with our stream
sys.stdout = temp_out

print("This is going in to the memory stream")
temp_out.write("Can be written to like normal.\n")

# The original `sys.stdout` is kept in a special
# dunder named `sys.__stdout__`. So you can restore
# the original output stream to the terminal.
sys.stdout = sys.__stdout__

print("Now printing back to terminal")
print("The 'fake' stdout contains: =======")

Note that the StringIO object is the same type of object created when you call open() and open a file with the r flag. There is also an io.BytesIO object for byte streams, which is the type of object you get when calling open() with rb.

Also note that there is sys.stderr and sys.stdin that you can manipulate in the same ways. They also have the corresponding sys.__stderr__ and sys.__stdin__ originals.


After reading this, you should know how to create in-memory files for both text and binary data as well as how to temporary replace the default system standard out with your own object to capture data.