5

私はPython2.5では正常に動作するが2.7では動作しないこのコードを持っています:

import sys
import traceback
try:
    from io import StringIO
except:
    from StringIO import StringIO

def CaptureExec(stmt):
    oldio = (sys.stdin, sys.stdout, sys.stderr)
    sio = StringIO()
    sys.stdout = sys.stderr = sio
    try:
        exec(stmt, globals(), globals())
        out = sio.getvalue()
    except Exception, e:
        out = str(e) + "\n" + traceback.format_exc()
    sys.stdin, sys.stdout, sys.stderr = oldio
    return out

print "%s" % CaptureExec("""
import random
print "hello world"
""")

そして私は得る:

文字列引数が必要です、'str'を取得しました
トレースバック(最後の最後の呼び出し):
  CaptureExecのファイル「D:\ 3.py」、13行目
    exec(stmt、globals()、globals())
  ファイル""、3行目、
TypeError:文字列引数が必要です。'str'を取得しました
4

2 に答える 2

14

io.StringIO3.x バイト/文字列の世界からバックポートされているため、Python 2.7 では混乱します。このコードはあなたのものと同じエラーを受け取ります:

from io import StringIO
sio = StringIO()
sio.write("Hello\n")

原因:

Traceback (most recent call last):
  File "so2.py", line 3, in <module>
    sio.write("Hello\n")
TypeError: string argument expected, got 'str'

Python 2.x のみを使用している場合は、ioモジュールを完全にスキップして、StringIO を使用してください。本当に を使用したい場合はio、インポートを次のように変更します。

from io import BytesIO as StringIO
于 2010-08-06T12:57:21.257 に答える
2

悪い知らせだ

io.StringIO は Unicode で作業したいと考えています。uこのように印刷したい文字列の前にa を置くことで修正できると思うかもしれません

print "%s" % CaptureExec("""
import random
print u"hello world"
""")

ただしprint、StringIO への 2 つの書き込みが発生するため、これは実際には壊れています。最初のものはu"hello world"どちらでも構いませんが、その後に続きます"\n"

代わりに、このようなものを書く必要があります

print "%s" % CaptureExec("""
import random
sys.stdout.write(u"hello world\n")
""")
于 2010-08-06T12:58:05.567 に答える