¿Cómo configurar la codificación sys.stdout en Python 3?
Configurar la codificación de salida predeterminada en Python 2 es un modismo bien conocido:
sys.stdout = codecs.getwriter("utf-8")(sys.stdout)
Esto envuelve el sys.stdout
objeto en un escritor de códec que codifica la salida en UTF-8.
Sin embargo, esta técnica no funciona en Python 3 porque sys.stdout.write()
espera un str
, pero el resultado de la codificación es bytes
y se produce un error cuando codecs
intenta escribir los bytes codificados en el original sys.stdout
.
¿Cuál es la forma correcta de hacer esto en Python 3?
Desde Python 3.7 puedes cambiar la codificación de transmisiones estándar con reconfigure()
:
sys.stdout.reconfigure(encoding='utf-8')
También puede modificar cómo se manejan los errores de codificación agregando un errors
parámetro.
Se agregó Python 3.1 io.TextIOBase.detach()
, con una nota en la documentación para sys.stdout
:
Las transmisiones estándar están en modo texto de forma predeterminada. Para escribir o leer datos binarios en estos, utilice el búfer binario subyacente. Por ejemplo, para escribir bytes en
stdout
, utilicesys.stdout.buffer.write(b'abc')
. El usoio.TextIOBase.detach()
de transmisiones se puede hacer binario de forma predeterminada. Esta función establecestdin
ystdout
en binario:
def make_streams_binary(): sys.stdin = sys.stdin.detach() sys.stdout = sys.stdout.detach()
Por lo tanto, el modismo correspondiente para Python 3.1 y posteriores es:
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())