在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终端吗?
答案 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)
无论如何,翻译似乎工作正常,但这让我很紧张,我不认为这是一个“可接受”的答案,所以如果其他人有更好的想法......