这是一个旧答案,但我会在这里添加我的版本,因为我在找到我的解决方案之前第一次冒险来到这里。
codecs.getwriter 的问题之一是,如果您正在运行某种脚本,输出将被缓冲(而通常 python stdout 在每一行之后打印)。
sys.stdout
在控制台中是一个 IOTextWrapper,所以我的解决方案使用它。这也允许您设置 line_buffering=True 或 False。
例如,要将 stdout 设置为,而不是错误,反斜杠编码所有输出:
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() 将关闭底层缓冲区。某些模块 use 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)