просто подумал, что добавлю свою идею ... подходило для моих целей - запустить sthg в Eclipse, а затем запустить из (Windows) CLI без получения исключений кодирования с каждым оператором печати.
Что бы вы ни делали, не делайте EncodingStdout подклассом файла класса: строка «self.encoding = encoding» приведет к тому, что атрибут кодирования будет None!
NB. Одна вещь, которую я обнаружил в течение дня, пытаясь разобраться с этим, заключается в том, что исключение кодирования возникает перед тем, как перейти к «печати» или «записи»: это когда параметризованная строка (т.е. "% (" blip "," blap ")) создается ... что ??? "рамки"?
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" )