pip install-locale.Error:不支持的语言环境设置


232

完整的堆栈跟踪:

  ~ pip install virtualenv
Traceback (most recent call last):
  File "/usr/bin/pip", line 11, in <module>
    sys.exit(main())
  File "/usr/lib/python3.4/site-packages/pip/__init__.py", line 215, in main
    locale.setlocale(locale.LC_ALL, '')
  File "/usr/lib64/python3.4/locale.py", line 592, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting

在同一台服务器上,我成功运行pip install virtualenv了python2.7.x。

现在,我刚刚使用安装了python3.4 curl https://bootstrap.pypa.io/get-pip.py | python3.4

  ~ pip --version
pip 8.1.1 from /usr/lib/python3.4/site-packages (python 3.4)

pip uninstall virtualenv 也会引发相同的错误


2
你读过这个吗?
idjaw

是的,我有@idjaw,节点,在我的情况下,它是一个空字符串,它与您指出的错误语言环境不同
ericn 2016年

是的,我确实注意到了。您尝试过pkg-reconfigure吗?
idjaw

我的服务器是centos,不是Ubuntu @idjaw,我已经检查过了,本地服务器似乎没有问题LANG=en_GB.utf8
ericn

Answers:


616

根本原因是:您的环境变量LC_ALL丢失或以某种方式无效

简短答案-

只需运行以下命令:

$ export LC_ALL=C

如果在新的终端窗口中仍然出现错误,请在.bashrc文件底部添加错误。

长答案-

这是我的locale设置:

$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=C

Python2.7

    $ uname -a
    Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1+deb8u6 (2015-11-09) x86_64 GNU/Linux
    $ python --version
    Python 2.7.9
    $ pip --version
    pip 8.1.1 from /usr/local/lib/python2.7/dist-packages (python 2.7)
    $ unset LC_ALL
    $ pip install virtualenv
    Traceback (most recent call last):
      File "/usr/local/bin/pip", line 11, in <module>
        sys.exit(main())
      File "/usr/local/lib/python2.7/dist-packages/pip/__init__.py", line 215, in main
        locale.setlocale(locale.LC_ALL, '')
      File "/usr/lib/python2.7/locale.py", line 579, in setlocale
        return _setlocale(category, locale)
    locale.Error: unsupported locale setting
    $ export LC_ALL=C
    $ pip install virtualenv
    Requirement already satisfied (use --upgrade to upgrade): virtualenv in /usr/local/lib/python2.7/dist-packages

5
那么那只是设置环境变量的问题吗?你知道我为什么从来没有遇到过吗?该值不应该自动设置吗?
ericn '16

@eric嗨,我只是更新我的帖子。我的计算机上的python2.7确实会发生此问题。
ROY 2016年

@ROY确实非常有趣,我已经设置了另外2个几乎与此服务器相同的服务器,而且它们一直工作得很好
ericn '16

我在使用letsencrypt-auto时遇到了这个问题,并提供了export LC_ALL=C帮助。
maniexx '16

10
如果您想知道是什么LC_ALL=C意思,请参见此处
加勒特(Garrett)

41

运行以下命令(它将起作用):

export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
sudo dpkg-reconfigure locales

(-1)该dpkg-reconfigure命令适用于基于Debian的系统。这个问题用标记centos,RHEL派生类不支持dpkg,除非您启用epel-release存储库并安装dpkg-develdpkg-dev软件包。即使那样,这也不是理想的解决方案。

30

有人可能会觉得有用。您可以将这些语言环境设置放在.bashrc文件中,该文件通常位于主目录中。
只需在.bashrc中添加此命令:
export LC_ALL=C
然后键入source .bashrc
Now,例如,当您通过ssh连接时,您无需每次都手动调用此命令。


4

尽管可以设置导出环境变量的语言环境,但每次启动会话时都必须这样做。以这种方式设置语言环境将永久解决问题:

sudo apt-get install locales
sudo locale-gen en_US.UTF-8
sudo echo "LANG=en_US.UTF-8" > /etc/default/locale

我是不是误会了,还是sudo在同一行上尝试安装它?sudo apt-get install ... sudo ...
Cyber​​Ed '18年

2
@Cyber​​Ed,您是对的,我已经编辑了该示例以删除不需要的依赖项。
Marco Lavagnino

3

[此答案仅适用于linux平台]

您应该知道的第一件事是,大多数语言环境配置文件的定位路径都可以从localedef --help以下位置获取:

$ localedef --help | tail -n 5
System's directory for character maps : /usr/share/i18n/charmaps
                       repertoire maps: /usr/share/i18n/repertoiremaps
                       locale path    : /usr/lib/locale:/usr/share/i18n
For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>

看到最后一个/usr/share/i18n?这是您的xx_XX.UTF-8配置文件所在的位置:

$ ls /usr/share/i18n/locales/zh_*
/usr/share/i18n/locales/zh_CN  /usr/share/i18n/locales/zh_HK  /usr/share/i18n/locales/zh_SG  /usr/share/i18n/locales/zh_TW

怎么办 ?我们需要将它们编译为存档二进制文件。一种方式,例如假设我有/usr/share/i18n/locales/en_LOVE,我可以将其添加到编译列表(即/etc/locale-gen文件)中:

$ tail -1 /etc/locale.gen 
en_LOVE.UTF-8 UTF-8

并将其编译为二进制sudo locale-gen

$ sudo locale-gen 
Generating locales (this might take a while)...
  en_AG.UTF-8... done
  en_AU.UTF-8... done
  en_BW.UTF-8... done
  ...
  en_LOVE.UTF-8... done
Generation complete.

且以期望现在更新系统默认的语言环境LANGLC_ALL...等与此update-locale

sudo update-locale LANG=en_LOVE.UTF-8

update-locale实际上还意味着更新此/etc/default/locale文件,该文件将在登录时由系统提供以设置环境变量:

$ head /etc/default/locale 
#  File generated by update-locale
LANG=en_LOVE.UTF-8
LC_NUMERIC="en_US.UTF-8"
...

但是我们可能不想重启才能生效,因此我们可以将其来源到当前shell会话中的环境变量:

$ . /etc/default/locale

怎么sudo dpkg-reconfigure locales样 如果您玩转它,您将知道此命令基本上充当GUI来简化上述步骤,即Edit /etc/locale.gen-> sudo locale-gen->sudo update-locale LANG=en_LOVE.UTF-8

对于python,只要/etc/locale.gen包含该语言环境候选者并locale.gen进行编译,就setlocale(category, locale)可以正常运行locale.Error: unsupoorted locale setting。您可以通过观察文件来检查要在中设置的正确字符串en_US.UTF-8/ ,然后取消注释并根据需要对其进行编译。该文件中不带点的表示正确的字符串是和。en_US/....etcsetlocale()/etc/locale.genzh_CN GB2312zh_CNzh_CN.GB2312


对于我的情况,简短的答案是:1.编辑/etc/locale.gen,取消注释zh_CN.UTF-8行;2 sudo locale-gen
SnowOnion



1

该错误消息表示语言环境设置有问题。要解决此问题(如其他答案所示),您需要修改语言环境。

在Mac OS X Sierra上,我发现最好的方法是~/bash_profile按如下所示修改文件:

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

除非您使用以下命令重新加载bash配置文件,否则此更改在当前cli会话中不会立即显现source ~/.bash_profile

这个答案非常接近我发布给其他非相同,非重复的问题(即与pipenv不相关)的答案,但是碰巧需要相同的解决方案。

致主持人:尊敬;由于这个原因,我以前的答案被删除了,但是我觉得这有点愚蠢,因为实际上,无论何时只要错误是“语言环境问题”,这个答案都适用...但是可能会触发多种不同的情况,语言和环境该错误。

因此,A)将问题标记为重复项是没有意义的,而B)调整答案也没有意义,因为解决方法非常简单,在每种情况下都是相同的,并且无法从修饰中受益。


1

Ubuntu:

$ sudo vi /etc/default/locale

在文件末尾添加以下设置。

LC_ALL = en_US.UTF-8

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.