python locale 奇怪错误,究竟发生了什么?

31 投票
3 回答
14475 浏览
提问于 2025-04-15 16:35

今天我把软件升级到了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 个回答

4

这是一个Mac OS X的问题。要查看你的地区设置,可以在终端里输入 locale。如果你输入 locale -a,它会列出你定义的所有地区设置(这些可以作为LC_ALL的参数使用)。

注意,当定义了 LC_ALL 和其他 LC_* 变量时,它们会优先于 LANG

10

我也遇到过同样的问题。当我运行 locale 命令时,发现 LANGLC_ALL 这两个设置没有被配置好。所以我通过在 .bash_profile 文件中添加以下几行来解决这个问题:

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

然后我简单地运行了:

source ~/.bash_profile 

之后这个问题在我的Mac上就解决了。

17

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/

撰写回答