python:在exec语句中获取打印输出

use*_*794 28 python printing exec

我有一点问题.这是我的代码:

code = """
i = [0,1,2]
for j in i :
    print j
"""
result = exec(code)
Run Code Online (Sandbox Code Playgroud)

我怎么能得到打印出来的东西?我怎样才能得到类似的东西:

0
1
2
Run Code Online (Sandbox Code Playgroud)

问候和感谢,

Joc*_*zel 38

我有与Frédéric相同的想法,但我写了一个上下文管理器来处理替换stdout:

import sys
import StringIO
import contextlib

@contextlib.contextmanager
def stdoutIO(stdout=None):
    old = sys.stdout
    if stdout is None:
        stdout = StringIO.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()
Run Code Online (Sandbox Code Playgroud)


Fré*_*idi 8

您可以在exec调用期间将标准输出重定向到字符串:

    code = """
i = [0,1,2]
for j in i :
print j
"""

from cStringIO import StringIO
old_stdout = sys.stdout
redirected_output = sys.stdout = StringIO()
exec(code)
sys.stdout = old_stdout

print redirected_output.getvalue()
Run Code Online (Sandbox Code Playgroud)

  • 只是想添加注释,为了使这个Python 3友好,你必须从io import StringIO`从`io` =>`导入`StringIO`. (3认同)

Ily*_*rov 6

这是@Jochen答案的Py3友好版本。我还添加了try-except子句以在中出现错误时进行恢复code

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:
    try:
        exec(code)
    except:
        print("Something wrong with the code")
print("out:", s.getvalue())
Run Code Online (Sandbox Code Playgroud)