在python 2.7 shell中,执行以下操作后:
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
shell停止显示结果。如果我输入print('hello world')
,则不会显示任何内容。
顺便说一下,为什么reload(sys)
在这里必不可少?没有它,setdefaultencoding()会导致错误吗?
答案 0 :(得分:0)
关于需要reload(sys)
的问题与IDLE无关。阅读2.7 doc条目的最后一句。
sys.setdefaultencoding函数(名称)
设置Unicode实现使用的当前默认字符串编码。 如果name与任何可用的编码不匹配, 引发了LookupError。此功能仅供以下人员使用 站点模块实现,并在需要时由sitecustomize实现。 一旦由站点模块使用,它将从sys模块中删除 命名空间。
你不应该使用这个功能。在3.x中,它已被删除(或不可见)。因此来自标准Python控制台解释器的以下内容。
C:\Users\Terry>py
Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 20:40:30) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys
<module 'sys' (built-in)>
>>> sys.setdefaultencoding
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'setdefaultencoding'
在2.7中,重新加载重新初始化模块,撤消删除。因此
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding
<built-in function setdefaultencoding>
编辑:删除了不相关的材料,并添加了以下正确答案。
关于打印问题:重新加载也撤消IDLE对输出流的修改。这会禁用打印命令。他们执行(不要加注)但实际上没有发送任何内容。
>>> print 'abc', u'abc'
>>>
以上是在重新加载之后但在调用恢复的setdefaultencoding之前。我打算在IDLE doc警告中添加一条注释,重新加载sys会通过撤消其修改来禁用IDLE。