2011-08-01 8 views
0

私はPyramidを使用していますが、これはおそらくやりたいことではありませんが、本当にクールです。私はstdoutに印刷するPythonスクリプトをたくさん持っています。今はPyramidの要求/応答の一部としてこれらのスクリプトを実行したいと思います。つまり、スクリプトの標準出力をキャプチャしてテンプレートに書きたいと思っています。 カメレオンZPTテンプレートを使用して印刷文を書き出します

捕獲標準出力部分

は非常に簡単です:

import sys 
sys.stdout = tbd 

私の知る限りrender_to_responseは、このいずれかをサポートしていません見ることができるよう:

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

私は(書き込みを得ることができますどのように任意のアイデア)テンプレートの操作?

答えて

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) 
3

また、その後、stdoutにStringIO.StringIOオブジェクトを渡すコンテキスト辞書を経由して、テンプレートに渡し、ちょうどテンプレートに適切なタイミングで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のサブクラスを作成することができますあなたが合っていると思われるもの。

+0

作品を。それは本当にありがとう! – mark

関連する問題