¿Cómo imprimir texto codificado en UTF-8 en la consola en Python <3?

Estoy ejecutando un sistema Linux reciente donde todos mis locales son UTF-8:

LANG=de_DE.UTF-8
LANGUAGE=
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
...
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=

Ahora quiero escribir contenido codificado en UTF-8 en la consola.

En este momento, Python usa UTF-8 para la codificación FS pero se mantiene en ASCII para la codificación predeterminada :-(

>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.getfilesystemencoding()
'UTF-8'

Pensé que la mejor manera (limpia) de hacer esto era establecer elPYTHONIOENCODING Variable ambiental. Pero parece que Python lo ignora. Al menos en mi sistema sigo recibiendoascii como codificación predeterminada, incluso después de configurar elenvvar.

# tried this in ~/.bashrc and ~/.profile (also sourced them)
# and on the commandline before running python
export PYTHONIOENCODING=UTF-8

Si hago lo siguiente al inicio de un script, funciona bien:

>>> import sys
>>> reload(sys)  # to enable `setdefaultencoding` again
<module 'sys' (built-in)>
>>> sys.setdefaultencoding("UTF-8")
>>> sys.getdefaultencoding()
'UTF-8'

Pero ese enfoqueparece inmundo. Entonces, ¿cuál es una buena manera de lograr esto?

Solución

En lugar de cambiar la codificación predeterminada, que esno es Buena idea (ver la respuesta de mesilliac) - acabo de envolversys.stdout con unStreamWriter Me gusta esto:

sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)

Veresta esencia Para una pequeña función de utilidad, que la maneja.

Respuestas a la pregunta(3)

Su respuesta a la pregunta