在Python 2中设置默认输出编码是一个众所周知的习惯用法:
sys.stdout = codecs.getwriter("utf-8")(sys.stdout)
这会将sys.stdout
对象 Package 在编解码器编写器中,该编解码器编写器以UTF-8编码输出。
然而,这种技术在Python 3中不起作用,因为sys.stdout.write()
期望的是str
,但编码的结果是bytes
,当codecs
试图将编码的字节写入原始sys.stdout
时,会发生错误。
在Python 3中,正确的方法是什么?
7条答案
按热度按时间gkn4icbw1#
从Python 3.7开始,你可以用
reconfigure()
改变标准流的编码:您还可以通过添加
errors
参数来修改编码错误的处理方式。z5btuh9x2#
Python 3.1添加了
io.TextIOBase.detach()
,在sys.stdout
的文档中有一个注解:默认情况下,标准流处于文本模式。要向这些流写入或读取二进制数据,请使用底层二进制缓冲区。例如,要向
stdout
写入字节,请使用sys.stdout.buffer.write(b'abc')
。使用io.TextIOBase.detach()
流可以默认为二进制。此函数将stdin
和stdout
设置为二进制:因此,Python 3.1及更高版本的相应习惯用法是:
0mkxixxg3#
我在寻找解决相同错误的方法时发现了这个线程,
对于那些已经建议的解决方案,一个替代方案是在Python启动**之前设置
PYTHONIOENCODING
环境变量,供我使用-这比在Python初始化后交换sys.stdout
麻烦更少:它的优点是不必去编辑Python代码。
6vl6ewon4#
其他答案似乎建议使用
codecs
,但open
适合我:即使我用
PYTHONIOENCODING="ascii"
运行它,也能正常工作。u3r8eeie5#
在Python 2中设置默认输出编码是一个众所周知的习惯用法
咦!这是Python 2中的一个众所周知的习惯用法吗?在我看来这是一个危险的错误。
它肯定会搞乱任何试图将二进制文件写入标准输出的脚本(例如,如果您是一个返回图像的CGI脚本,您将需要它)。将指定接受字节的接口与只接受字符的接口进行“修补”并不是一个好主意。
CGI和HTTP通常显式地使用字节。您应该只向sys. stdout发送字节。在Python 3中,这意味着使用
sys.stdout.buffer.write
直接发送字节。编码页面内容以匹配其charset
参数应该在应用程序的更高级别处理(在返回文本内容而不是二进制内容的情况下)。这也意味着print
不再适合CGI。(To更令人困惑的是,直到最近,wsgiref的CGIHandler在py 3 k中被破坏了,使得不可能以这种方式将WSGI部署到CGI。
ijnw1ujt6#
使用
detach()
会导致解释器在退出之前试图关闭stdout时打印一个警告:相反,这对我来说很好:
(And当然,写入
default_out
而不是stdout。)igsr9ssn7#
sys.stdout
在Python 3中处于文本模式。因此,您可以直接向其写入unicode,并且不再需要Python 2的习惯用法。这在Python 2中会失败:
然而,它在Python 3中工作得很好:
现在,如果你的Python不知道你的stdouts编码实际上是什么,这是一个不同的问题,最有可能在Python的构建中。