我考虑将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
是一个空列表。
答案 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'