【问题标题】:pip install - locale.Error: unsupported locale settingpip install - locale.Error: 不支持的区域设置
【发布时间】:2016-07-23 11:45:23
【问题描述】:

完整的堆栈跟踪:

➜  ~ 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 也会抛出同样的错误

【问题讨论】:

  • 你读过this了吗?
  • 是的,我有@idjaw,节点在我的情况下它是一个空字符串,它与您指出的错误语言环境不同
  • 是的,我确实注意到了。你试过 pkg-reconfigure 了吗?
  • 我的服务器是centos,不是Ubuntu @idjaw,我查了一下,本地好像没有问题LANG=en_GB.utf8

标签: python python-3.x centos pip


【解决方案1】:

在 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

解决了。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,"export LC_ALL=c" 对我不起作用

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

      【讨论】:

        【解决方案4】:

        Ubuntu:

        $ sudo vi /etc/default/locale

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

        LC_ALL = en_US.UTF-8

        【讨论】:

          【解决方案5】:

          根本原因是:您的环境变量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
          

          【讨论】:

          • 那么这只是设置环境变量的问题吗?你知道为什么我以前从来没有遇到过这种情况吗?这个值不应该自动设置吗?
          • @eric 嗨,我刚刚更新了我的帖子。我的电脑上的 python2.7 确实会出现这个问题。
          • 确实很有趣@ROY,我已经设置了另外 2 个几乎与此服务器相同的服务器,并且它们运行得非常好
          • 如果您想知道LC_ALL=C 的含义,请参阅here
          • 简短的回答“LC_ALL=C”绰绰有余。谢谢。
          【解决方案6】:

          [此答案仅针对 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 的情况下工作。您可以通过观察/etc/locale.gen 文件来检查要在setlocale() 中设置的正确字符串en_US.UTF-8/en_US/....etc,然后根据需要取消注释并编译它。 zh_CN GB2312 在该文件中没有点表示正确的字符串是 zh_CNzh_CN.GB2312

          【讨论】:

          • 对于我的情况,简短的回答是:1. 编辑/etc/locale.gen,取消注释zh_CN.UTF-8 行; 2.sudo locale-gen.
          【解决方案7】:

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

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

          【讨论】:

          • 我误解了,还是您在尝试安装它的同一行上使用了sudosudo apt-get install ... sudo ...
          • @Cyber​​Ed ,你是对的,我已经编辑了示例以删除不需要的依赖项。
          【解决方案8】:

          错误消息表明区域设置存在问题。要按照其他答案的指示解决此问题,您需要修改您的语言环境。

          在 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) 调整答案也没有意义,因为修复非常简单,在每种情况下都是相同的,并且不会从装饰中受益.

          【讨论】:

            【解决方案9】:

            对于 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: not found

            【讨论】:

              【解决方案10】:

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

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

              【讨论】:

              • (-1) dpkg-reconfigure 命令用于基于 Debian 的系统。这个问题用centos 标记,这是一个不提供对dpkg 支持的RHEL 衍生产品,除非您启用epel-release 存储库并安装dpkg-develdpkg-dev 软件包。即便如此,这也不是一个理想的解决方案。
              猜你喜欢
              • 2016-08-25
              • 2021-04-27
              • 2014-11-13
              • 2016-09-02
              • 2020-07-24
              • 1970-01-01
              • 2020-04-23
              • 2021-08-01
              • 1970-01-01
              相关资源
              最近更新 更多