¿Cómo configurar la codificación sys.stdout en Python 3?

Resuelto Greg Hewgill asked hace 13 años • 7 respuestas

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.stdoutobjeto 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 bytesy se produce un error cuando codecsintenta escribir los bytes codificados en el original sys.stdout.

¿Cuál es la forma correcta de hacer esto en Python 3?

Greg Hewgill avatar Dec 07 '10 14:12 Greg Hewgill
Aceptado

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 errorsparámetro.

sth avatar Sep 17 '2018 16:09 sth

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, utilice sys.stdout.buffer.write(b'abc'). El uso io.TextIOBase.detach()de transmisiones se puede hacer binario de forma predeterminada. Esta función establece stdiny stdouten 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())
Greg Hewgill avatar Dec 07 '2010 07:12 Greg Hewgill