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 code> e-mail code> pour construire l'e-mail. P>
Mes idées jusqu'à présent étaient: p>
4 Réponses :
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 Ceci est un moyen peu coûteux. Je vous recommanderais de faire votre sortie à l'aide du module code> de journalisation code>. Vous aurez beaucoup plus de contrôle sur la production et vous pouvez le contrôler plus facilement. P> Imprimer code> pour générer la sortie dans toutes ces fonctions. Si tel est le cas, vous pouvez simplement remplacer
sys.stdout code> avec un
stringio.stringio code> qui interceptera tout ce que vous écrivez. Ensuite, vous pouvez enfin appeler la méthode
.gevalue code> sur votre
stringio code> 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 code>. P>
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 CODE>. Pour une pièce jointe, vous auriez à mime-encoder la pièce jointe à l'aide des utilisateurs dans le package code> e-mail CODE>, puis joignez-le à votre email. Ensuite, envoyez-le enfin en utilisant
smptmail code>. Il y a quelques exemples ici docs.python.org/library/email-examples.html a>
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.
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()
J'ai modifié la réponse de rien pour en faire un gestionnaire de contexte: utilisation: p>
Et j'ai modifié la réponse de Gary Robinson pour vous assurer que stdout code> est toujours restauré, même s'il y a une exception: