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.