python: get the print output in an exec statement
Since Python 3.4 there is a solution is the stdlib: https://docs.python.org/3/library/contextlib.html#contextlib.redirect_stdout
from io import StringIOfrom contextlib import redirect_stdoutf = StringIO()with redirect_stdout(f): help(pow)s = f.getvalue()
In older versions you can write a context manager to handle replacing stdout:
import sysfrom io import StringIOimport contextlib@contextlib.contextmanagerdef stdoutIO(stdout=None): old = sys.stdout if stdout is None: stdout = StringIO() sys.stdout = stdout yield stdout sys.stdout = oldcode = """i = [0,1,2]for j in i : print j"""with stdoutIO() as s: exec(code)print("out:", s.getvalue())
Here is Py3-friendly version of @Jochen's answer. I also added try-except
clause to recover in case of errors in the code
.
import sysfrom io import StringIOimport contextlib@contextlib.contextmanagerdef stdoutIO(stdout=None): old = sys.stdout if stdout is None: stdout = StringIO() sys.stdout = stdout yield stdout sys.stdout = oldcode = """i = [0,1,2]for j in i : print(j)"""with stdoutIO() as s: try: exec(code) except: print("Something wrong with the code")print("out:", s.getvalue())
You can redirect the standard output to a string for the duration of the exec call:
code = """i = [0,1,2]for j in i :print j"""from cStringIO import StringIOold_stdout = sys.stdoutredirected_output = sys.stdout = StringIO()exec(code)sys.stdout = old_stdoutprint redirected_output.getvalue()