完整堆栈跟踪:

➜  ~ 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卸载virtualenv也抛出相同的错误


当前回答

[这个答案只针对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/locale / 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 locale怎么样?如果你使用它,你会知道这个命令基本上充当GUI来简化上面的步骤,即编辑/etc/localegen -> sudo locale-gen -> sudo update-locale LANG=en_LOVE。utf - 8

对于python,只要设置/etc/locale.Gen包含locale candidate和locale。Gen get编译,setlocale(category, locale)应该在没有抛出locale的情况下工作。错误:不支持的区域设置。您可以检查正确的字符串en_US. utf -8/en_US/....Etc要在setlocale()中设置,通过观察/etc/locale.生成文件,然后取消注释并按需要编译它。该文件中没有点的zh_CN GB2312表示正确的字符串是zh_CN和zh_CN.GB2312。

其他回答

[这个答案只针对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/locale / 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 locale怎么样?如果你使用它,你会知道这个命令基本上充当GUI来简化上面的步骤,即编辑/etc/localegen -> sudo locale-gen -> sudo update-locale LANG=en_LOVE。utf - 8

对于python,只要设置/etc/locale.Gen包含locale candidate和locale。Gen get编译,setlocale(category, locale)应该在没有抛出locale的情况下工作。错误:不支持的区域设置。您可以检查正确的字符串en_US. utf -8/en_US/....Etc要在setlocale()中设置,通过观察/etc/locale.生成文件,然后取消注释并按需要编译它。该文件中没有点的zh_CN GB2312表示正确的字符串是zh_CN和zh_CN.GB2312。

对于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

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

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

执行以下命令(可以运行):

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

在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

解决它。