5

我有这段代码在 Python 2.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 行
    执行(stmt,全局(),全局())
  文件“”,第 3 行,在
TypeError:需要字符串参数,得到'str'
4

2 回答 2

14

io.StringIO在 Python 2.7 中令人困惑,因为它是从 3.x 字节/字符串世界向后移植的。此代码得到与您相同的错误:

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 回答