7
votes

Capture de stdout dans le même processus en python

J'ai un script Python qui appelle une bande de fonctions, chacune écrivant une sortie sur stdout. Parfois, lorsque je l'exécute, je voudrais envoyer la sortie dans un e-mail (avec un fichier généré). J'aimerais savoir comment je peux capturer la sortie en mémoire afin que je puisse utiliser le module e-mail pour construire l'e-mail.

Mes idées jusqu'à présent étaient:

  • Utilisez un fichier mail de mémoire (mais il semble que je dois réserver de la place sur disque pour cela, et je ne sais pas combien de temps la sortie sera)
  • contourner tout cela et tuyer la sortie à Sendmail (mais cela peut être difficile si je souhaite également joindre le fichier)

0 commentaires

4 Réponses :


4
votes

Vous avez dit que votre script "appelle un tas de fonctions", donc je suppose que les fonctions Python sont accessibles à partir de votre programme. Je suppose également que vous utilisez Imprimer pour générer la sortie dans toutes ces fonctions. Si tel est le cas, vous pouvez simplement remplacer sys.stdout avec un stringio.stringio qui interceptera tout ce que vous écrivez. Ensuite, vous pouvez enfin appeler la méthode .gevalue sur votre stringio pour obtenir tout ce qui a été envoyé au canal de sortie. Cela fonctionnera également pour des programmes externes utilisant le module de sous-traitement qui écrit sur sys.stdout .

Ceci est un moyen peu coûteux. Je vous recommanderais de faire votre sortie à l'aide du module de journalisation . Vous aurez beaucoup plus de contrôle sur la production et vous pouvez le contrôler plus facilement.


4 commentaires

Merci. Pas cher devrait être bien pour l'instant. Si j'allais utiliser la journalisation, comment puis-je construire l'e-mail (gardant à l'esprit qu'il existe un fichier à joindre)?


+1 pour le module de journalisation, les impressions sont vraiment limitées dans ce que vous pouvez faire à leur sujet


Je t'en prie. Créer un e-mail simple avec un corps de texte peut être effectué à l'aide du package SMTPMAIL . Pour une pièce jointe, vous auriez à mime-encoder la pièce jointe à l'aide des utilisateurs dans le package e-mail , puis joignez-le à votre email. Ensuite, envoyez-le enfin en utilisant smptmail . Il y a quelques exemples ici docs.python.org/library/email-examples.html


En ce qui concerne l'obtention du contenu que vous avez connecté, vous pouvez simplement créer un courrier électronique et l'ajouter à votre enregistreur qui détiendra ce que vous enregistrez afin que vous puissiez l'obtenir plus tard, le formater et l'envoyer.



8
votes

Il est assez simple de capturer la sortie.

import sys, StringIO
old_stdout = sys.stdout
capturer = StringIO.StringIO()
sys.stdout = capturer
#call functions
print "Hi"
#end functions
sys.stdout = old_stdout
output = capturer.getvalue()


0 commentaires

14
votes

J'ai modifié la réponse de rien pour en faire un gestionnaire de contexte: xxx

utilisation: xxx


0 commentaires

2
votes

Et j'ai modifié la réponse de Gary Robinson pour vous assurer que stdout est toujours restauré, même s'il y a une exception: xxx


0 commentaires