python语言环境奇怪的错误.到底是怎么回事? [英] python locale strange error. what's going on here exactly?
问题描述
所以今天我升级到集市2.0.2,我开始收到此消息(我在雪豹上,顺便说一句):
So today I upgraded to bazaar 2.0.2, and I started receiving this message (I'm on snow leopard, btw):
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实际上是空的.当我尝试修改语言环境模块时,也会发生类似的事情
very strange, since my LANG is actually empty. Similar thing happen when I try to tinker with the locale module
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')
为了更好的可查询性,请您解释一下这里发生了什么事?
Could you please explain what's going on here, for better googlability ?
推荐答案
2016更新:事实证明,此是至少自2013年以来的一个Python错误,很可能也是更早的一个错误,其中包括Python对非GNU语言环境(如Mac OS X和BSD中的语言)的反应不佳.该错误从2016年9月开始仍然开放,并且会影响每个Python版本.
2016 UPDATE: Turns out that this is a Python bug since at least 2013, very probably earlier too, consisting in Python not reacting well to non-GNU locales - like those found in Mac OS X and the BSDs. The bug is still open as of September 2016, and affects every Python version.
如果没有设置LANG
环境变量,则可能是将LC_CTYPE
(键变量)或LC_ALL
(将覆盖设置)覆盖了环境变量而设置为UTF-8
的情况,而不是有效的OS X语言环境.使用Apple提供的/usr/bin/python
或使用自定义python进行复制非常容易,就像您的情况一样,该python是使用10.6 SDK(可能也是10.5 SDK)构建的.您将无法使用python.org python以这种方式重现它;它们当前是使用10.4 SDK构建的,其中区域设置API的行为有所不同.
If there was no LANG
environment variable set, chances are you had either an LC_CTYPE
(the key variable) or LC_ALL
(which overrides if set) environment variable set to UTF-8
, which is not a valid OS X locale. It's easy enough to reproduce with the Apple-supplied /usr/bin/python
or with a custom python, as in your case, that was built with the 10.6 SDK (probably also the 10.5 SDK). You won't be able to reproduce it that way with a python.org python; they are currently built with the 10.4 SDK where the locale APIs behave differently.
$ 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,则会设置权限问题;我自己被那个问题烧死了.在python lib/python2.5/lib-dynload
目录中检查_locale.so
的权限,并确保它是755
. MacPorts的完整路径应为:
There may be another piece to the puzzle. A quick look at the bzr
2.0.1 I have installed indicates that the message you cite should only show up if locale.getpreferredencoding()
raises a locale.Error
. One way that can happen is if the python _locale.so
C extension can't be loaded and that can happen if there are permission problems on it. For example, MacPorts currently is known to have problems setting permissions if you have a customized umask; I've been burned by that issue myself. Check the permissions of _locale.so
in the python lib/python2.5/lib-dynload
directory and ensure it is 755
. The full path for MacPorts should be:
/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-dynload/
这篇关于python语言环境奇怪的错误.到底是怎么回事?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!