Доброго времени суток!
Что-то у меня вообще все сломалось :(
Python 2.6 (2.4), Windows XP SP3 локаль русская.
вот небольшой кусок кода:
# -*- mode: python; coding: utf-8 -*-
from __future__ import print_function, division
import codecs, os, sys
sys.stdout = codecs.getwriter('cp866')(sys.stdout, errors='replace')
import logging, logging.handlers
if "__main__" == __name__ :
log = logging.getLogger()
_console = logging.StreamHandler(sys.stdout)
_console.setLevel(logging.DEBUG)
log.addHandler(_console)
_file = logging.handlers.RotatingFileHandler("test.log", "ab", 5242880, 0, encoding="cp1251")
_file.setLevel(logging.DEBUG)
log.addHandler(_file)
log.setLevel(logging.DEBUG)
## пробуем, что получилось
log.info(u"Проба пера")
_file.flush()
_file.close()
log.removeHandler(_file)
_console.flush()
_console.close()
log.removeHandler(_console)
при выполнении получаю следующее:
Traceback (most recent call last):
File "C:\Python26\lib\logging\__init__.py", line 765, in emit
self.stream.write(fs % msg.encode("UTF-8"))
File "C:\Python26\lib\codecs.py", line 351, in write
data, consumed = self.encode(object, self.errors)
File "C:\Python26\lib\encodings\cp866.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 14: ordinal
not in range(128)
Traceback (most recent call last):
File "C:\Python26\lib\logging\__init__.py", line 765, in emit
self.stream.write(fs % msg.encode("UTF-8"))
File "C:\Python26\lib\codecs.py", line 686, in write
return self.writer.write(data)
File "C:\Python26\lib\codecs.py", line 351, in write
data, consumed = self.encode(object, self.errors)
File "C:\Python26\lib\encodings\cp1251.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_table)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 43: ordinal
not in range(128)
если в коде закоментировать строку sys.stdout = codecs.getwriter('cp866')(sys.stdout, errors='replace')
то получаю следующий вывод:
root.<module>#Проба пера!
Traceback (most recent call last):
File "C:\Python26\lib\logging\__init__.py", line 765, in emit
self.stream.write(fs % msg.encode("UTF-8"))
File "C:\Python26\lib\codecs.py", line 686, in write
return self.writer.write(data)
File "C:\Python26\lib\codecs.py", line 351, in write
data, consumed = self.encode(object, self.errors)
File "C:\Python26\lib\encodings\cp1251.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_table)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 43: ordinal
not in range(128)
если же снова раскоментировать строку sys.stdout = codecs.getwriter('cp866')(sys.stdout, errors='replace')
и в файле C:\Python26\Lib\logging\__init__.py строки с 753 по 770 включительно заменить на
try:
msg = self.format(record)
fs = "%s\n"
if isinstance(msg, unicode) :
self.stream.write(fs % msg)
else:
self.stream.write(fs % msg.decode(self.stream.encoding)) # здесь бы по идее подставить кодировку сообщения, но как ее угадаешь :)
self.flush()
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record)
то и в консоль и в файл все выводится без ошибок.
однако править родной модуль Python не есть правильная практика, отсюда вопрос - как быть?
PS. при указанной замене в файле C:\Python26\Lib\logging\__init__.py и закоментированной строке sys.stdout = codecs.getwriter('cp866')(sys.stdout, errors='replace')
получаем ошибку при выводе на консоль, но нормальный вывод в файл