使用Chameleon ZPT模板写出print语句

时间:2011-08-01 17:00:08

标签: python pyramid chameleon

我正在使用金字塔,我知道这可能不是首选的做事方式,但它真的很酷。我有一堆Python脚本打印到stdout。现在我想在Pyramid中将这些脚本作为请求/响应的一部分运行。我的意思是我想捕获脚本的标准输出并将其写入模板。

捕获标准输出部分非常简单:

import sys
sys.stdout = tbd

据我所知,render_to_response不支持以下任何内容:

return render_to_response(’templates/foo.pt’,
    {’foo’:1, ’bar’:2},
    request=request)

知道如何在模板上进行write()操作吗?

2 个答案:

答案 0 :(得分:3)

您可以将StringIO.StringIO对象传递给stdout,然后通过上下文字典将其传递给模板,并在模板中的适当时间调用StringIO.StringIO.getvalue():

import sys

def my_view(request):
    old_stdout = sys.stdout
    new_stdout = StringIO.StringIO()
    sys.stdout = new_stdout

    # execute your scripts

    sys.stdout = old_stdout

    return render_to_response('template/foo.pt', {'foo': 1, 'bar': 2, 'stdout': new_stdout},
        request=request)

然后在模板中:

<html>
  <body>
    <!-- stuff -->
    ${stdout.getvalue()}
    <!-- other stuff -->
  </body>
</html>

您可能需要添加一个过滤器以确保文本格式正确,或者您可能只需使用__html__方法创建StringIO.StringIO的子类,该方法可以按您认为合适的方式呈现内容。 / p>

答案 1 :(得分:3)

我可能会使用子进程模块来捕获脚本的标准输出,而不是导入它并直接运行它:

import StringIO
output = StringIO.StringIO()
result = subprocess.call('python', 'myscript.py', stdout=output)
value = output.get_value()

string = render(’templates/foo.pt’,
    {'value':value},
    request=request)