Python ASTEVAL。我怎样才能捕获标准输出

时间:2014-07-30 10:56:42

标签: python exec eval stdout

我考虑将asteval python package用于我的个人网络应用。

  

ASTEVAL是Python表达式和语句的安全(ish)评估程序,使用Python的ast模块。我们的想法是提供一种简单,安全,强大的微型数学语言,可以处理用户输入。

我遇到的问题是我无法获得asteval的标准。我尝试使用以下代码捕获它:

from asteval import Interpreter

aeval = Interpreter()

from cStringIO import StringIO
import sys

class Capturing(list):
    def __enter__(self):
        self._stdout = sys.stdout
        sys.stdout = self._stringio = StringIO()
        return self
    def __exit__(self, *args):
        self.extend(self._stringio.getvalue().splitlines())
        sys.stdout = self._stdout

然后:

with Capturing() as output:
    aeval('print "this should be captured"')

但没有运气,output是一个空列表。

1 个答案:

答案 0 :(得分:2)

您可以将文件对象(writer)传递给Interpreter()类:

output = StringIO()
aeval = Interpreter(writer=output)
如果您未指定,则

writer默认为sys.stdout,并在Interpreter()实例化时设置。这就是为什么替换sys.stdout不起作用的原因;该实例已经有了自己的引用。

演示:

>>> from cStringIO import StringIO
>>> from asteval import Interpreter
>>> output = StringIO()
>>> aeval = Interpreter(writer=output)
>>> aeval('print "this should be captured"')
>>> output.getvalue()
'this should be captured\n'