这段代码解决了我遇到的问题.但是,没有重新加载就无法使用"setdefaultencoding".
什么是这种语言的怪癖叫什么?为什么我之前没有告诉过?我在哪里可以阅读更多相关信息.
import sys; reload(sys); sys.setdefaultencoding("utf8")
从
http://mypy.pythonblogs.com/12_mypy/archive/1253_workaround_for_python_bug_ascii_codec_cant_encode_character_uxa0_in_position_111_ordinal_not_in_range128.html
'quirk'是故意删除该功能的site
模块 :sys.setdefaultencoding()
# Remove sys.setdefaultencoding() so that users cannot change the # encoding after initialization. The test for presence is needed when # this module is run as a script, because this code is executed twice. if hasattr(sys, "setdefaultencoding"): del sys.setdefaultencoding
你应该不使用它!将默认编码设置为UTF-8就像在你打破并走路后将一根棍子绑在腿上,而不是让医生设置断骨.
真的,让我说清楚:有一个原因它被删除,原因是你将a)打破任何依赖于正常默认值的模块和b)你正在掩盖你的实际问题,这是通过正确处理Unicode尽可能早地解码并推迟编码,直到您需要再次发送数据.
除此之外,该reload()
功能的工作方式是它允许您绕过模块缓存; import
将只加载一次Python模块; 后续导入为您提供已加载的模块.reload()
加载模块a-new就像从未导入过一样,并将新名称合并回现有模块对象(以保留以后添加的额外名称):
重新加载以前导入的模块.参数必须是模块对象,因此必须先成功导入.如果您使用外部编辑器编辑了模块源文件并希望在不离开Python解释器的情况下试用新版本,这将非常有用.返回值是模块对象(与模块参数相同).
何时
reload(module)
执行:
重新编译Python模块的代码并重新执行模块级代码,定义一组新的对象,这些对象绑定到模块字典中的名称.
init
扩展模块的功能不是第二次调用.与Python中的所有其他对象一样,只有在引用计数降为零后才会回收旧对象.
模块名称空间中的名称将更新为指向任何新对象或已更改的对象.
对旧对象的其他引用(例如模块外部的名称)不会反弹以引用新对象,如果需要,必须在每个命名空间中进行更新.
因此,reload()
将已删除的sys.setdefaultencoding()
名称还原到模块中.