pip install - 区域设置。错误:不支持的区域设置

问题描述 投票:0回答:10

完整的堆栈跟踪:

➜  ~ 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

在同一台服务器上,我使用 python 2.7.x 成功运行了

pip install virtualenv

现在,我刚刚使用

curl https://bootstrap.pypa.io/get-pip.py | python3.4
安装了python3.4。

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

pip uninstall virtualenv
也抛出同样的错误

python python-3.x centos pip
10个回答
663
投票

根本原因是:你的环境变量

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

45
投票

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

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

32
投票

有人可能会发现它很有用。您可以将这些区域设置放在 .bashrc 文件中,该文件通常位于主目录中。
只需在 .bashrc 中添加此命令即可:

export LC_ALL=C

然后输入
source .bashrc

现在,您不需要每次都手动调用此命令,例如通过 ssh 连接时。


4
投票

虽然您可以设置导出环境变量的区域设置,但每次启动会话时都必须执行此操作。以这种方式设置区域设置将永久解决问题:

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

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.

现在用所需的

LANG
LC_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 来简化上述步骤,即编辑
/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/....etc
中设置的正确字符串
setlocale()
/
/etc/locale.gen
,然后根据需要取消注释并编译它。该文件中没有点的
zh_CN GB2312
表示正确的字符串是
zh_CN
zh_CN.GB2312


2
投票

对于 Dockerfile,这对我有用:

RUN locale-gen en_US.UTF-8  
ENV LANG en_US.UTF-8  
ENV LANGUAGE en_US:en  
ENV LC_ALL en_US.UTF-8  

如何安装locale-gen?

docker ubuntu /bin/sh: 1: locale-gen: 未找到


2
投票

我也遇到了同样的问题,并且

"export LC_ALL=c"
对我不起作用

尝试

export LC_ALL="en_US.UTF-8"
(会起作用的)。


1
投票

Ubuntu:

$ sudo vi /etc/default/locale

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

LC_ALL = en_US.UTF-8


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"

此更改不会在您当前的 cli 会话中立即显现出来,除非您使用以下命令重新加载 bash 配置文件:

source ~/.bash_profile


0
投票

在 Fedora 上也有类似的问题:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python3.10/locale.py", line 620, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting

原来是缺少“glibc-all-langpacks”包。

dnf install -y glibc-all-langpacks
© www.soinside.com 2019 - 2024. All rights reserved.