少し問題があります。これが私のコードです:
code = """
i = [0,1,2]
for j in i :
print j
"""
result = exec(code)
印刷物を出力するにはどうすればよいですか?どうすれば次のようなものを入手できますか?
0
1
2
よろしくお願いいたします。
私は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()
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()
これが@Jochenの答えのPy3対応バージョンです。また、code
でエラーが発生した場合に回復するためにtry-except
句を追加しました。
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())
これがフレデリックの答えの小さな修正です。通常のstdout
に戻すには、exec()
で発生する可能性のある例外を処理する必要があります。そうでなければ、それ以上のprint
出力を見ることができませんでした:
code = """
i = [0,1,2]
for j in i :
print j
"""
from cStringIO import StringIO
old_stdout = sys.stdout
redirected_output = sys.stdout = StringIO()
try:
exec(code)
except:
raise
finally: # !
sys.stdout = old_stdout # !
print redirected_output.getvalue()
...
print 'Hello, World!' # now we see it in case of the exception above
何かのようなもの:
codeproc = subprocess.Popen(code, stdout=subprocess.PIPE)
print(codeproc.stdout.read())
別のプロセスでコードを実行し、codeproc.stdout
を介して出力をメインプログラムにパイプで戻す必要があります。しかし、私は個人的にそれを使用したことがないので、私が間違ったことをしたことがあれば、それを指摘してください:P