A partire da Python 2.6 è possibile utilizzare qualsiasi cosa l'attuazione del TextIOBase
API dal modulo IO come una sostituzione. Questa soluzione consente inoltre di utilizzare sys.stdout.buffer.write()
in Python 3 per scrivere (già) stringhe di byte codificate su stdout (vedere stdout in Python 3). L'utilizzo di StringIO
non funzionerebbe quindi, perché né né sys.stdout.buffer
sarebbero disponibili.
Una soluzione con 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
Questa soluzione funziona per Python 2> = 2.6 e Python 3.
Si prega di notare che i nostri nuovi sys.stdout.write()
accetta solo le stringhe Unicode e sys.stdout.buffer.write()
accetta solo stringhe di byte. Questo potrebbe non essere il caso per il vecchio codice, ma è spesso il caso per il codice che è stato creato per funzionare su Python 2 e 3 senza modifiche, che spesso utilizza lo sys.stdout.buffer
.
È possibile costruire una piccola variazione che accetta Unicode e byte stringhe per 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)
Non è necessario per impostare la codifica del tampone del sys.stdout.encoding, ma questo aiuta quando si utilizza questo metodo per testare/confrontare l'output dello script.
non credo 'stdout = o pen ("file", "a") 'di per sé reindirizzerà qualsiasi cosa. – Alexey