Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OSX上的locale.getlocale()问题_Python_Macos_Localization_Osx Snow Leopard_Locale - Fatal编程技术网

Python OSX上的locale.getlocale()问题

Python OSX上的locale.getlocale()问题,python,macos,localization,osx-snow-leopard,locale,Python,Macos,Localization,Osx Snow Leopard,Locale,我需要让系统语言环境做很多事情,最终我想用gettext翻译我的应用程序。我打算在Linux和OSX上发布它,但在OSX雪豹上遇到了问题: $ python Python 2.5.2 (r252:60911, Jan 4 2009, 17:40:26) [GCC 4.3.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import locale &

我需要让系统语言环境做很多事情,最终我想用gettext翻译我的应用程序。我打算在Linux和OSX上发布它,但在OSX雪豹上遇到了问题:

$ python
Python 2.5.2 (r252:60911, Jan  4 2009, 17:40:26) 
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'sv_SE.UTF-8'
>>> locale.getlocale()
('sv_SE', 'UTF8')

$ 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.setlocale(locale.LC_ALL, '')
'C'
>>> locale.getlocale()
(None, None)
这两个系统都使用瑞典语。在Linux上,环境变量LANG已经设置为“sv_SE.UTF-8”。如果我将该变量传递给OSX上的python(
LANG=“sv_SE.UTF-8”python
),就会很好地检测到区域设置。但是
locale.getlocale()
不应该能够获取操作系统拥有的任何语言吗?我不想强迫用户设置
LANG
LC\u ALL
或任何环境变量

locale
命令的输出:

$ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=
OSX(Smow Leopard 10.6.1)上的奇数

编辑:

我刚在墙上找到这个

基本上,这取决于在运行时您的环境中设置了什么(LANG、LANGUAGE、LC_ALL中的一个),我在shell环境中设置了LANG=en_GB.UTF-8

编辑:

我刚在墙上找到这个


基本上,这取决于运行时在您的环境中设置了什么(LANG、LANGUAGE、LC_ALL中的一个)。我在shell环境中设置了LANG=en_GB.UTF-8

看起来您可以通过更改环境变量
LC_ALL
来更改区域设置

$ export LC_ALL=C
$ python
Python 2.5.1 (r251:54863, Feb  6 2009, 19:02:12) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, "")
'C'
>>> locale.getlocale()
(None, None)    

$ export LC_ALL=en_GB.UTF-8
$ python
Python 2.5.1 (r251:54863, Feb  6 2009, 19:02:12) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, "")
'en_GB.UTF-8'
>>> locale.getlocale()
('en_GB', 'UTF8')

看起来您可以通过更改环境变量
LC\u ALL
来更改区域设置

$ export LC_ALL=C
$ python
Python 2.5.1 (r251:54863, Feb  6 2009, 19:02:12) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, "")
'C'
>>> locale.getlocale()
(None, None)    

$ export LC_ALL=en_GB.UTF-8
$ python
Python 2.5.1 (r251:54863, Feb  6 2009, 19:02:12) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getlocale()
(None, None)
>>> locale.setlocale(locale.LC_ALL, "")
'en_GB.UTF-8'
>>> locale.getlocale()
('en_GB', 'UTF8')

一个可怕的黑客,但我插入了这个:

import platform

# ...

# XXX horrendous OS X invalid locale hack
if platform.system() == 'Darwin':
    import locale
    if locale.getlocale()[0] is None:
        locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')

在项目的早期阶段。此后,我可以在所有与我相关的操作系统上使用未经修改的shell环境运行我的程序(我的程序确定了以后在处理过程中使用的语言)。

这无疑是一个可怕的黑客攻击,但我插入了以下内容:

import platform

# ...

# XXX horrendous OS X invalid locale hack
if platform.system() == 'Darwin':
    import locale
    if locale.getlocale()[0] is None:
        locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
在项目的早期阶段。之后,我可以在所有与我相关的操作系统上使用未经修改的shell环境运行我的程序(我的程序确定了以后在处理过程中使用的语言).

发件人:尝试添加或编辑
~/.profile
~/.bash\u profile
文件,以便在启动新会话时正确导出您的区域设置

export LC_ALL=en_US.UTF-8  
export LANG=en_US.UTF-8
From:尝试添加或编辑
~/.profile
~/.bash\u profile
文件,以便在启动新会话时正确导出您的区域设置

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

老问题,但这可能会帮助其他人:这是一个截至2016年3月在Python2或Python3中仍未解决的Python错误:

总结一下,Python假设类似GNU的区域设置,并避免出现BSD环境中的差异(如OSX)。UTF8语言环境存在于BSD中,而不是Linux中,因此出现了问题

至于解决方案或调试:本地环境变量可以通过Terminal.app进行设置(请参阅Preferences-Profiles-Advanced-International;对于iTerm或其他类似的设置)。因此,可以在终端窗口中查找设置的区域设置环境变量,但在运行打包应用程序时查找未设置的变量

对于某些情况(如python 2.7中的Sphinx和OS X中的3.5因“ValueError:unknown locale:UTF-8”而消亡),禁用首选项复选框以设置locale环境变量是解决方案

但这可能会在其他程序中引起问题:如果没有设置区域设置变量,Bash4.3(来自MacPorts)会在每次提示时抱怨“警告:setlocale:LC_CTYPE:cannotchange locale():没有这样的文件或目录”


因此,考虑到该漏洞是在Python中出现的,解决方法可能应该是在Python程序(如@Jacob Oscarson的回答)或Python调用(通过将区域设置变量设置为适当的值)中完成。

旧问题,但这可能会帮助其他人:这是一个截至2016年3月在Python 2或3中仍未解决的Python漏洞:

总结一下,Python假设类似GNU的区域设置,并避免出现BSD环境中的差异(如OSX)。UTF8语言环境存在于BSD中,而不是Linux中,因此出现了问题

至于解决方案或调试:本地环境变量可以通过Terminal.app进行设置(请参阅Preferences-Profiles-Advanced-International;对于iTerm或其他类似的设置)。因此,可以在终端窗口中查找设置的区域设置环境变量,但在运行打包应用程序时查找未设置的变量

对于某些情况(如python 2.7中的Sphinx和OS X中的3.5因“ValueError:unknown locale:UTF-8”而消亡),禁用首选项复选框以设置locale环境变量是解决方案

但这可能会在其他程序中引起问题:如果没有设置区域设置变量,Bash4.3(来自MacPorts)会在每次提示时抱怨“警告:setlocale:LC_CTYPE:cannotchange locale():没有这样的文件或目录”


因此,考虑到该bug是在Python中出现的,解决方法可能应该在Python程序(如@Jacob Oscarson的回答)或Python调用(通过将区域设置变量设置为适当的值)中完成。

奇怪。在最初的帖子中,我使用的是iTerm,但是如果我使用Terminal.app,我会得到一个错误(ValueError:unknown locale:UTF-8)。区域设置看起来很奇怪:“C/UTF-8/C/C/C”。也许我的系统有点混乱,但它是雪豹的一个相当新鲜的安装。请参阅我的编辑,了解为什么会出现更改-您的系统没有被弄乱(好了,不再是所有OSX python)-抱歉,当我编辑看到您的链接,并且从我可以收集到的,它不能完成,因为OSX没有使用朗或LC所有。我对uuu CF_USER_TEXT_编码变量很感兴趣,但解析它似乎有点愚蠢。IMO getlocale()应该调用适当的API:s并为您解析它,而不是依赖于某些环境变量。@pojo,您说得很对:这是一个python错误,看起来他们可能最终使用本机语言环境API而不是环境变量。唉,还没有修好。奇怪的在最初的帖子中,我使用了iTerm,但是如果我使用term