172 votes

Puis-je rediriger la sortie standard en python dans une sorte de tampon de chaîne ?

Je suis à l'aide de python ftplib d'écrire un petit client FTP, mais certaines fonctions dans le package n'est pas de retour de la sortie de chaîne, mais l'impression d' stdout. Je veux rediriger stdout à un objet qui je vais être capable de lire la sortie de.

Je connais stdout peut être redirigée vers un fichier régulier avec:

stdout = open("file", "a")

Mais je préfère une méthode qui n'utilise pas le disque local.

Je suis à la recherche de quelque chose comme l' BufferedReader en Java qui peut être utilisé pour envelopper un tampon dans un cours d'eau.

247voto

Ned Batchelder Points 128913
from cStringIO import StringIO
import sys

old_stdout = sys.stdout
sys.stdout = mystdout = StringIO()

# blah blah lots of code ...

sys.stdout = old_stdout

# examine mystdout.getvalue()

133voto

41voto

Bethor Points 2997

Juste pour ajouter à la réponse de Ned ci-dessus : cela vous permet de rediriger la sortie vers n’importe quel objet qui implémente une méthode write(str).

Cela peut servir à bon escient pour « attraper » sortie stdout dans une application GUI.

Voici un exemple idiot de PyQt :

8voto

JonnyJD Points 1100

En commençant avec la version 2.6 de Python, vous pouvez utiliser n'importe quoi la mise en œuvre de l' TextIOBase API de l'io module de remplacement. Cette solution permet également d'utiliser des sys.stdout.buffer.write() en Python 3 pour écrire (déjà) codé des chaînes d'octets vers stdout (voir stdout dans Python 3). À l'aide de StringIO ne serait pas travailler, parce que ni sys.stdout.encoding ni sys.stdout.buffer seraient disponibles.

Une solution à l'aide de TextIOWrapper:

import sys
from io import TextIOWrapper, BytesIO

# setup the environment
old_stdout = sys.stdout
sys.stdout = TextIOWrapper(BytesIO(), sys.stdout.encoding)

# do something that writes to stdout or stdout.buffer

# get output
sys.stdout.seek(0)      # jump to the start
out = sys.stdout.read() # read output

# restore stdout
sys.stdout.close()
sys.stdout = old_stdout

Cette solution fonctionne pour Python 2 >= 2.6 et Python 3.

Veuillez noter que notre nouveau sys.stdout.write() accepte uniquement les chaînes unicode et sys.stdout.buffer.write() accepte uniquement les chaînes d'octets. Cela pourrait ne pas être le cas pour l'ancien code, mais c'est souvent le cas pour le code qui est conçue pour s'exécuter sur Python 2 et 3 sans modification, ce qui rend souvent l'utilisation d' sys.stdout.buffer.

Vous pouvez construire une légère variation qui accepte unicode et les chaînes d'octets pour write():

class StdoutBuffer(TextIOWrapper):
    def write(self, string):
        try:
            return super(StdoutBuffer, self).write(string)
        except TypeError:
            # redirect encoded byte strings directly to buffer
            return super(StdoutBuffer, self).buffer.write(string)

Vous n'avez pas à définir l'encodage de la mémoire tampon de la sys.la sortie standard stdout.le codage, mais cela aide lors de l'utilisation de cette méthode pour tester/comparer les résultats de script.

3voto

Utilisation `` et d’écriture dans le descripteur de fichier approprié.

http://www.Python.org/doc/2.3/lib/OS-FD-OPS.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X