Search code examples
pythonprintingexec

python: get the print output in an exec statement


I want to get the output of an exec(...) Here is my code:

code = """
i = [0,1,2]
for j in i :
    print j
"""
result = exec(code)

How could I get the things that print outputed? How can I get something like:

0
1
2

Regards and thanks.


Solution

  • 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 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())