Comment faire pour capturer la sortie standard sortie d'un Python appel de fonction?
Je suis en utilisant une bibliothèque Python qui fait quelque chose à un objet
do_something(my_object)
et la change. En faisant de la sorte, il affiche des statistiques sur la sortie standard, et j'aimerais avoir de l'emprise sur cette information. La bonne solution serait de changer do_something()
pour retourner des informations pertinentes,
out = do_something(my_object)
mais il faudra un certain temps avant que les devs de do_something()
à cette question. Comme solution, j'ai pensé à l'analyse ce que do_something()
écrit sur la sortie standard stdout.
Comment capturer la sortie standard (stdout) de sortie entre deux points dans le code, par exemple,
start_capturing()
do_something(my_object)
out = end_capturing()
?
- double possible de la capture d'dis.dis résultats
- Ma réponse dans la question s'applique ici aussi.
- J'ai essayé de le faire une fois et la meilleure réponse que j'ai trouvé: stackoverflow.com/a/3113913/1330293
- lié réponse est une solution élégante
- Voir ce répondre.
Vous devez vous connecter pour publier un commentaire.
Essayer ce gestionnaire de contexte:
Utilisation:
output
est maintenant une liste contenant les lignes imprimées par l'appel de la fonction.Utilisation avancée:
Ce qui peut ne pas être évident, c'est que cela peut être fait plus d'une fois et les résultats concaténés:
De sortie:
Mise à jour: Ils ont ajouté
redirect_stdout()
àcontextlib
en Python 3.4 (avecredirect_stderr()
). Vous pouvez utiliserio.StringIO
avec que, pour arriver à un résultat similaire (bien queCapturing
être une liste ainsi qu'un gestionnaire de contexte est sans doute plus pratique)..extend()
au lieu de sorte qu'il pourrait être utilisé concatenatively, tout comme vous l'avez remarqué. 🙂self._stringio.truncate(0)
après laself.extend()
appel dans le__exit__()
méthode pour libérer de la mémoire occupée par le_stringio
membre.StringIO
instance sera créée à chaque fois que le gestionnaire de contexte est utilisé de toute façon, et le vieux va aller loin pour le moment, mais vous pouvez définirself._stringio
àNone
(oudel
) dans__exit__()
si l'intérimaire de l'utilisation de la mémoire est un problème.stderr
ainsi, comme je l'ai voulu capturerargsparse
message d'erreur.from io import StringIO
au lieu de la première ligne dans le gestionnaire de contexte.fontforge
)del
instruction nécessaire? J'aurais pensé qu'après__exit__
est fini, tout est hors de portée et sera rapidement nettoyée.En python >= 3.4, contextlib contient un
redirect_stdout
décorateur. Il peut être utilisé pour répondre à votre question comme:De les docs: