Codificación stdout en python

¿Hay alguna buena razón por la que no debería iniciar todos mis progtwigs de Python con esto? ¿Hay algo especial perdido al hacer un ejecutivo como este?

#!/usr/bin/python import os, sys if sys.stdout.encoding == None: os.putenv("PYTHONIOENCODING",'UTF-8') os.execv(sys.executable,['python']+sys.argv) print sys.stdout.encoding 

Hay 60 preguntas acerca de PYTHONIOENCODING, así que supongo que es un problema común, pero en caso de que no lo sepas, esto se hace porque cuando sys.stdout.encoding == None , solo puedes imprimir caracteres print "åäö" , por ejemplo, print "åäö" lanzará una excepción ..

EDITAR Esto me sucede cuando stdout es una pipa; python encoding.py|cat establecerá la encoding en Ninguna

Otra solución es cambiar el códec de stdout sys.stdout = codecs.getwriter('utf8')(sys.stdout) que supongo que es la respuesta correcta a pesar de los comentarios sobre esa pregunta.

Sí, hay una buena razón para no iniciar todos los progtwigs de Python de esa manera.

Ante todo:

sys.stdout.encoding es None si Python no sabe qué encoding soporta la stdout. Esto, en la mayoría de los casos, se debe a que realmente no admite ninguna encoding. En su caso es porque el stdout es un archivo, y no un terminal. Pero podría establecerse en Ninguno porque Python tampoco detecta la encoding del terminal.

En segundo lugar: establece la variable de entorno y luego inicia un nuevo proceso con el comando smae nuevamente. Eso es bastante feo.

Por lo tanto, a menos que planee ser el único que usa sus progtwigs, no debería iniciarlos así. Pero si planea ser el único que usa su progtwig, entonces adelante.

Una explicación más detallada.

Una mejor solución genérica bajo Python 2 es tratar la salida estándar como lo que es: una interfaz de 8 bits. Y eso significa que todo lo que imprima en stdout debe ser de 8 bits. Obtiene el error cuando intenta imprimir datos Unicode, porque la impresión intentará codificar los datos Unicode a la encoding de la salida estándar, y si es Ninguno, asumirá ASCII, y fallará, a menos que establezca PYTHONIOENCODING.

Pero al imprimir datos codificados, no tiene este problema. Lo siguiente funciona perfectamente incluso cuando se canaliza la salida:

 print u'ÅÄÖ'.encode('UTF8') 

(Sin embargo, esto fallará en Python 3, porque en Python 3, la salida estándar ya no es IO de 8 bits, se supone que debe darle datos Unicode y se codificará por sí solo. Si le da datos binarios, se imprimirá la representación. Por lo tanto, en Python 3 no tiene este problema en primer lugar).