2011-08-01 2 views
0

J'utilise Pyramid et je sais que ce n'est probablement pas la façon préférée de faire les choses, mais ce serait vraiment cool. J'ai un tas de scripts Python qui impriment sur stdout. Maintenant, je veux exécuter ces scripts dans le cadre d'une requête/réponse dans Pyramid. Je veux dire que je veux capturer la sortie standard des scripts et l'écrire dans le template.utiliser caméléon modèles ZPT pour écrire des déclarations d'impression

La partie stdout de capture est assez facile:

import sys 
sys.stdout = tbd 

Pour autant que je peux voir render_to_response ne supporte pas de ceci:

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

Toute idée comment je peux obtenir une écriture() opération sur le gabarit?

Répondre

3

Je pourrais utiliser le module de sous-processus pour capturer le stdout du script au lieu de l'importer et l'exécuter directement:

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

Vous pouvez passer un objet StringIO.StringIO à stdout, puis passer également au modèle via le dictionnaire contextuel et il suffit d'appeler StringIO.StringIO.getvalue() au moment approprié dans le modèle:

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) 

puis dans le modèle:

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

vous aurez probablement besoin d'ajouter un filtre pour vous assurer que le texte est formaté correctement, ou vous pouvez simplement créer une sous-classe de StringIO.StringIO avec une méthode __html__ qui rendrait les choses comme vous le souhaitez.

+0

fonctionne comme un charme. Merci beaucoup pour ça! – mark

Questions connexes