python locale 奇怪错误,究竟发生了什么?
今天我把软件升级到了bazaar 2.0.2,然后我开始收到这个信息(顺便说一下,我用的是雪豹系统):
bzr: warning: unknown locale: UTF-8
Could not determine what text encoding to use.
This error usually means your Python interpreter
doesn't support the locale set by $LANG (en_US.UTF-8)
Continuing with ascii encoding.
这很奇怪,因为我的LANG其实是空的。当我尝试调整locale模块时,也发生了类似的事情。
Python 2.5.4 (r254:67916, Nov 30 2009, 14:09:22)
[GCC 4.3.4] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getdefaultlocale()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/sbo/runtimes/lib/python2.5/locale.py", line 443, in getdefaultlocale
return _parse_localename(localename)
File "/Users/sbo/runtimes/lib/python2.5/locale.py", line 375, in _parse_localename
raise ValueError, 'unknown locale: %s' % localename
ValueError: unknown locale: UTF-8
设置LANG也没有用。
sbo@dhcp-045:~ $ export LANG=en_US.UTF-8
sbo@dhcp-045:~ $ bzr
bzr: warning: unknown locale: UTF-8
Could not determine what text encoding to use.
This error usually means your Python interpreter
doesn't support the locale set by $LANG (en_US.UTF-8)
Continuing with ascii encoding.
不过,这个方法解决了问题。
sbo@dhcp-045:~ $ export LANG=en_US.UTF-8
sbo@dhcp-045:~ $ export LC_ALL=en_US.UTF-8
Python 2.5.4 (r254:67916, Nov 30 2009, 14:09:22)
[GCC 4.3.4] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getdefaultlocale()
('en_US', 'UTF8')
你能不能解释一下这里发生了什么,这样我在网上查找时会更方便?
3 个回答
这是一个Mac OS X的问题。要查看你的地区设置,可以在终端里输入 locale
。如果你输入 locale -a
,它会列出你定义的所有地区设置(这些可以作为LC_ALL的参数使用)。
注意,当定义了 LC_ALL
和其他 LC_*
变量时,它们会优先于 LANG
。
我也遇到过同样的问题。当我运行 locale
命令时,发现 LANG
和 LC_ALL
这两个设置没有被配置好。所以我通过在 .bash_profile
文件中添加以下几行来解决这个问题:
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
然后我简单地运行了:
source ~/.bash_profile
之后这个问题在我的Mac上就解决了。
2016年更新:结果发现这是一个Python的bug,从2013年起就存在,很可能更早就有了。这个问题是Python对非GNU地区设置反应不佳,比如在Mac OS X和BSD系统中出现的情况。到2016年9月,这个bug仍然没有解决,并且影响到所有版本的Python。
如果你没有设置LANG
这个环境变量,那么很可能你设置了LC_CTYPE
(这是关键变量)或者LC_ALL
(如果设置了会覆盖其他设置),而这两个变量的值是UTF-8
,但UTF-8
并不是一个有效的OS X地区设置。用苹果自带的/usr/bin/python
或者你自己编译的Python(比如用10.6 SDK编译的)很容易就能重现这个问题(可能用10.5 SDK编译的也会)。不过,如果你用的是python.org提供的Python,就不会出现这个问题,因为他们是用10.4 SDK编译的,那个SDK中的地区设置API表现得不一样。
$ unset LANG
$ env | grep LC_
$ export LC_CTYPE="UTF-8"
$ /usr/bin/python # Apple-supplied python
Python 2.6.1 (r261:67515, Jul 7 2009, 23:51:51)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale ; locale.getdefaultlocale()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/locale.py", line 459, in getdefaultlocale
return _parse_localename(localename)
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/locale.py", line 391, in _parse_localename
raise ValueError, 'unknown locale: %s' % localename
ValueError: unknown locale: UTF-8
^D
$ /usr/local/bin/python2.6 # python.org python
Python 2.6.4 (r264:75821M, Oct 27 2009, 19:48:32)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale ; locale.getdefaultlocale()
(None, 'mac-roman')
>>>
编辑:
可能还有其他因素。快速查看我安装的bzr
2.0.1发现,你提到的那个信息只有在locale.getpreferredencoding()
抛出locale.Error
时才会出现。造成这种情况的一种可能是Python的_locale.so
这个C扩展无法加载,这可能是因为权限问题。例如,MacPorts现在已知在你自定义了umask的情况下会有设置权限的问题
;我自己也遇到过这个问题。检查一下_locale.so
在Python的lib/python2.5/lib-dynload
目录下的权限,确保它是755
。对于MacPorts,完整路径应该是:
/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-dynload/