I hadSince Python 3.4 there is a solution is the same idea as Frédéric, but i wrotestdlib: https://docs.python.org/3/library/contextlib.html#contextlib.redirect_stdout
from io import StringIO from contextlib import redirect_stdout f = StringIO() with redirect_stdout(f): help(pow) s = f.getvalue() In older versions you can write a context manager to handle replacing stdout:
import sys from io import StringIO import contextlib @contextlib.contextmanager def stdoutIO(stdout=None): old = sys.stdout if stdout is None: stdout = StringIO() sys.stdout = stdout yield stdout sys.stdout = old code = """ i = [0,1,2] for j in i : print j """ with stdoutIO() as s: exec(code) print("out:", s.getvalue())