Это старый ответ, но я добавлю свою версию здесь, так как я впервые рискнул здесь, прежде чем найти свое решение.
Одна из проблем с codecs.getwriter заключается в том, что если вы выполняете своего рода скрипт, выходные данные будут буферизироваться (тогда как обычно python stdout печатает после каждой строки).
sys.stdout
в консоли - это IOTextWrapper, поэтому мое решение использует это. Это также позволяет вам установить line_buffering = True или False.
Например, чтобы установить стандартный вывод вместо кодирования с обратным слешем для всех выходных данных:
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding=sys.stdout.encoding,
errors="backslashreplace", line_buffering=True)
Для принудительного использования определенной кодировки (в данном случае utf8):
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding="utf8",
line_buffering=True)
Примечание: вызов sys.stdout.detach () закроет базовый буфер. Некоторые модули используют sys.__stdout__
, который является просто псевдонимом для sys.stdout
, поэтому вы можете также установить это
sys.stdout = sys.__stdout__ = io.TextIOWrapper(sys.stdout.detach(), encoding=sys.stdout.encoding, errors="backslashreplace", line_buffering=True)
sys.stderr = sys.__stderr__ = io.TextIOWrapper(sys.stderr.detach(), encoding=sys.stdout.encoding, errors="backslashreplace", line_buffering=True)