0

私は Pyramid を使用しており、これがおそらく好ましい方法ではないことはわかっていますが、これは非常にクールです。stdout に出力する Python スクリプトがたくさんあります。これらのスクリプトを Pyramid のリクエスト/レスポンスの一部として実行したいと考えています。つまり、スクリプトの stdout をキャプチャしてテンプレートに書き込みたいということです。

stdout 部分のキャプチャは非常に簡単です。

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

スクリプトをインポートして直接実行する代わりに、サブプロセスモジュールを使用してスクリプトのstdoutをキャプチャする場合があります。

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 に答える
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のサブクラスを作成することもできます。

于 2011-08-01T18:22:06.003 に答える