【问题标题】:python locale strange error. what's going on here exactly?python语言环境奇怪的错误。这里到底发生了什么?
【发布时间】:2010-12-22 06:30:17
【问题描述】:

所以今天我升级到 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 实际上是空的。当我尝试修改语言环境模块时会发生类似的事情

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')

您能否解释一下这里发生了什么,以便更好地进行谷歌搜索?

【问题讨论】:

  • 对您的问题有进一步的见解吗?
  • +1 两个“导出”行使我的“ValueError: unknown locale:...”消失了。
  • 非常感谢最后两行。救了我,我敢肯定很多其他 mac 用户有很多时间。

标签: python macos osx-snow-leopard locale


【解决方案1】:

2016 更新:事实证明,this is a Python bug 至少从 2013 年开始,很可能也更早,包括 Python 对非 GNU 语言环境的反应不佳 - 就像在 Mac OS X 和 BSD 中发现的那样。截至 2016 年 9 月,该错误仍然存​​在,并影响每个 Python 版本。


如果没有设置LANG 环境变量,您可能将LC_CTYPE(关键变量)或LC_ALL(如果设置将覆盖)环境变量设置为UTF-8,这不是有效的 OS X 语言环境。使用 Apple 提供的 /usr/bin/python 或使用自定义 python 进行复制很容易,就像您的情况一样,它是使用 10.6 SDK(可能也是 10.5 SDK)构建的。您将无法使用 python.org python 以这种方式重现它;它们目前是使用 10.4 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 目前已知有problems setting permissions if you have a customized umask;我自己也被这个问题烧死了。检查pythonlib/python2.5/lib-dynload目录下_locale.so的权限,确保为755。 MacPorts 的完整路径应该是:

/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/lib-dynload/

【讨论】:

  • 我使用的python是手动安装的,不是OSX捆绑的标准python安装。另外,看来我没有 _locale.so 或 _locale.dylib....呃?
  • lib-dynlib 中应该有一个 _locale.so。否则,您的 python 没有在 OS X 上正确构建,locale.py 将退回到一些默认行为。
  • @NedDeily,看起来你现在比这个答案显示的更清楚,因为你在bugs.python.org/issue18378#msg215215 中给出了很好的解释。也许你可以解决你的答案? (对于谷歌搜索,就像 OP 要求的那样)
  • @hmijail,感谢您的记忆。我只是快速浏览了一下,但我不确定 OS X 10.6 终端应用程序的行为方式是否与 10.9+ 相同;当然系统偏好选项是不同的。如果有人想花时间进一步调查,请随时编辑答案;这是 SO 的一个特点。
【解决方案2】:

我遇到了同样的问题。当我运行locale 时,我注意到LANGLC_ALL 未设置。所以我通过在.bash_profile 文件中添加以下行来解决这个问题:

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

然后我就简单地跑了:

source ~/.bash_profile 

此问题随后在我的 Mac 上得到修复。

【讨论】:

    【解决方案3】:

    这是 Mac OS X 的问题。要查看您的区域设置,请在终端中运行 localelocale -a 应该列出您已定义的所有语言环境(您可以将其用作 LC_ALL 的参数)。

    请注意,LC_ALL 和其他 LC_* 变量在定义时优先于 LANG

    【讨论】:

    • 更具体地说,这不仅仅是 Mac OS X 的环境问题。如果您自定义环境并无意中遗漏了某些内容,Linux 和其他 UNIX 克隆也容易出现同样的问题。有时问题会立即出现,有时直到您真正需要它们才能工作时才会出现。有太多方法来做同一件事的另一个症状......
    • @synack:这是以前在 OS X 中出现的问题,这就是为什么我不认为认为这是因为 Stefano 改变了他的环境。
    • @kaiser.se:为什么你认为这是一个问题,为什么是 OS X?设置 LC_CTYPE 或 LC_ALL 解释了 OP 看到的行为,并且按文档说明工作。我给出的示例在当前的 Debian Linux 系统上以完全相同的方式失败,除了该系统上较新的 bash 在将 LC_CTYPE 导出为无效值“UTF-8”时实际上会警告您。
    • 嘿,我知道你可以在 POSIX 上让它失败。然而,重要的是它似乎在 OS X 上反复出现,因为默认配置问题stackoverflow.com/questions/1629699/…article.gmane.org/gmane.comp.python.apple/16205
    • 这肯定会令人困惑,并且存在使用 10.4 SDK/libs 的 python.org pythons 的问题,其中语言环境有点损坏(我在写原始回复时忘记了这一点)。从 10.5 开始,事情变得更干净了。此外,python 3.1 在语言环境区域进行了一些清理,例如你不会再看到mac-roman了。不过,OP 显然没有使用 python.org python。
    猜你喜欢
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 2020-12-23
    相关资源
    最近更新 更多