A partir de Python 2.6 se puede utilizar cualquier cosa aplicación del TextIOBase
API del módulo io como un reemplazo. Esta solución también le permite usar sys.stdout.buffer.write()
en Python 3 para escribir (ya) cadenas de bytes codificadas en stdout (consulte stdout in Python 3). El uso de StringIO
no funcionaría, porque ni sys.stdout.encoding
ni sys.stdout.buffer
estarían disponibles.
Una solución usando 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
Esta solución funciona para Python 2> = 2.6 y Python 3.
Tenga en cuenta que nuestros nuevos sys.stdout.write()
sólo acepta cadenas Unicode y sys.stdout.buffer.write()
sólo se acepta cadenas de bytes. Este podría no ser el caso para el código anterior, pero a menudo es el caso para el código que está diseñado para ejecutarse en Python 2 y 3 sin cambios, que de nuevo a menudo hace uso de sys.stdout.buffer
.
Se puede construir una ligera variación que acepta cadenas Unicode y de bytes 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)
Usted no tiene que establecer la codificación de la memoria intermedia de la sys.stdout.encoding, pero esto ayuda al utilizar este método para probar/comparar la salida del script.
no creo que 'stdout = O pen ("file", "a") 'por sí mismo redirigirá cualquier cosa. – Alexey