我正在使用金字塔,我知道这可能不是首选的做事方式,但它真的很酷。我有一堆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()操作吗?
答案 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)