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)
您可以在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)
这是@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)