0

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

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

import sys
sys.stdout = tbd

据我所见,render_to_response 不支持以下任何一项:

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

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

4

2 回答 2

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>

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

于 2011-08-01T18:22:06.003 回答
3

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

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)
于 2011-08-01T20:52:23.417 回答