Spyder究竟对Unicode字符串做了什么?

时间:2014-10-11 07:54:20

标签: python unicode spyder

在Ubuntu 14.04上的标准GNU终端模拟器中运行Python,我在交互式输入时得到了预期的行为:

>>> len('tiθ')
4
>>> len(u'tiθ')
3

在Spyder中运行显式的utf8编码脚本时会发生同样的事情:

# -*- coding: utf-8 -*-
print(len('tiθ'))
print(len(u'tiθ'))

...提供以下输出,无论我是在新的专用解释器中运行它,还是在Spyder默认解释器中运行(如下所示):

>>> runfile('/home/dan/Desktop/mwe.py', wdir=r'/home/dan/Desktop')
4
3

但是当在Spyder的Python控制台中以交互方式输入时:

>>> len('tiθ')
4
>>> len(u'tiθ')
4

此问题已提出elsewhere,但该问题涉及Windows和Linux之间的差异。在这里,我在同一系统上的不同控制台中得到不同的结果,终端模拟器和Spyder中的控制台中的Python启动消息是相同的:

Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.

这里发生了什么,如何让Python-in-Spyder在unicode字符串方面表现得像Python-in-the-shell? @ martijn-pieters对this question发表评论

  

Spyder做了各种各样的事情来破坏Python环境。

但是我希望有一种解决这个特殊功能的方法,因为当我不能依赖我的交互式类型命令时,它很难在IDE中调试脚本产生与脚本作为整体运行coding: utf-8声明相同的结果。

更新

在GNU终端中:

>>> repr(u'tiθ')
"u'ti\\u03b8'"
>>> import sys
>>> sys.stdin.encoding
'UTF-8'
>>> sys.getdefaultencoding()
'ascii'

在Spyder控制台中:

>>> repr(u'tiθ')
"u'ti\\xce\\xb8'"
>>> import sys
>>> sys.stdin.encoding  # returns None
>>> sys.getdefaultencoding()
'UTF-8'

所以我知道,我可以说服Spyder表现得像GNU终端吗?

1 个答案:

答案 0 :(得分:0)

经过一些研究后,似乎奇怪的行为至少部分内置于Python中(参见this discussion thread;简而言之,Python将sys.stdin.encoding设置为None作为默认值,并且只有在检测到主机为tty并且可以检测到tty的编码时才更改它。

也就是说,一个hackish解决方法只是告诉Spyder使用/usr/bin/python3作为其可执行文件而不是默认值(即Python 2.7.6)。在Spyder或GNU终端模拟器中运行Python 3控制台时,我得到的结果与以前不同(更好!),但重要的是结果是一致的,无论是运行脚本还是交互式输入,无论使用GNU终端还是Spyder控制台:

>>> len('tiθ')
3
>>> len(u'tiθ')
3
>>> import sys
>>> sys.stdin.encoding
'UTF-8'
>>> sys.getdefaultencoding()
'utf-8'

这导致了Spyder中的其他问题:例如,它的sitecustomize.py脚本不是Python 3友好的,所以每个新的解释器都以

开头
Error in sitecustomize; set PYTHONVERBOSE for traceback:
SyntaxError: invalid syntax (sitecustomize.py, line 432)

无论如何,翻译似乎工作正常,但这让我很紧张,我不认为这是一个“可接受”的答案,所以如果其他人有更好的想法......