web-dev-qa-db-ja.com

python:execステートメントで出力を取得します

少し問題があります。これが私のコードです:

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

印刷物を出力するにはどうすればよいですか?どうすれば次のようなものを入手できますか?

0
1
2

よろしくお願いいたします。

29
user462794

私は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()
38
Jochen Ritzel

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

これが@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())
4
Ilya V. Schurov

これがフレデリックの答えの小さな修正です。通常の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
2
sergzach

何かのようなもの:

 codeproc = subprocess.Popen(code, stdout=subprocess.PIPE)
 print(codeproc.stdout.read())

別のプロセスでコードを実行し、codeproc.stdoutを介して出力をメインプログラムにパイプで戻す必要があります。しかし、私は個人的にそれを使用したことがないので、私が間違ったことをしたことがあれば、それを指摘してください:P

1
Blam