pensé en agregar mi idea ...se adaptaba a mis propósitos de poder ejecutar sthg en Eclipse y luego ejecutar desde la CLI (Windows) sin obtener excepciones de codificación con cada instrucción de impresión. Hagas lo que hagas, no hagas que EncodingStdout sea una subclase de archivo de clase: la línea "self.encoding = encoding" daría como resultado que el atributo de codificación sea None.
NB Una cosa que descubrí durante un día lidiando con esto es que la excepción de codificación se levanta ANTES de llegar a "imprimir" o "escribir": es cuando la cadena parametrizada (es decir, "mondodod% s blah blah% s "% (" blip "," blap ")) está construido por ... ¿qué? el marco"?
class EncodingStdout(object):
def __init__(self, encoding='utf-8'):
self.encoding = encoding
def write_ln(self, *args):
if len(args) < 2:
sys.__stdout__.write(args[ 0 ] + '\n')
else:
if not isinstance(args[ 0 ], basestring):
raise Exception("first arg was %s, type %s" % (args[ 0 ], type(args[ 0 ])))
# if the default encoding is UTF-8 don't bother with encoding
if sys.getdefaultencoding() != 'utf-8':
encoded_args = [ args[ 0 ] ]
for i in range(1, len(args)):
# numbers (for example) do not have an attribute "encode"
if hasattr(args[ i ], 'encode'):
encoded_args.append(args[ i ].encode(self.encoding, 'replace'))
else:
encoded_args.append(args[ i ])
args = encoded_args
sys.__stdout__.write(args[ 0 ] % tuple(args[ 1 : ]) + '\n')
# write seems to need a flush
sys.__stdout__.flush()
def __getattr__(self, name):
return sys.__stdout__.__getattribute__(name)
print "=== A mondodod %s %s" % ("été", "pluviôse, irritée contre la ville entière")
sys.stdout = EncodingStdout()
sys.stdout.write_ln("=== B mondodod %s %s", "été", "pluviôse, irritée contre la ville entière")
# convenience method
def pr(*args):
sys.stdout.write_ln(*args)
pr("=== C mondodod %s %s", "été", "pluviôse, irritée contre la ville entière")
'saved = sys.stdout' no es necesario,' sys .__ stdout__' siempre contiene el 'stdout' original, por lo que al final simplemente' sys.stdout = sys .__ stdout__'. – chown
guardar el sys.stdout le permite encadenar sobrescrituras; si escribe directamente en sys .__ stdout__ omitirá cualquier marco de trabajo de registro o tal que intente e inyecte en el programa. Lo mejor es guardar explícitamente el valor anterior de stdout. – Will
¿Hay alguna razón en particular para abrir el registro usando 'file()' en lugar de 'open()'? [La documentación no recomienda eso.] (Https://docs.python.org/2/library/functions.html#file) – Eric