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 virtualenvPython 2.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 выдает ту же ошибку тоже

ericn
источник
2
Вы уже читали это ?
idjaw
да, у меня есть @idjaw, узел, в моем случае это пустая строка, она отличается от неправильной локали, которую вы указали
ericn
Да, я это заметил. Вы пробовали переконфигурировать pkg?
idjaw
мой сервер Centos, а не Ubuntu @idjaw, я проверил, и, кажется, нет ничего плохого в локальном, этоLANG=en_GB.utf8
ericn

Ответы:

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
значит, это просто вопрос настройки переменной окружения? Вы знаете, почему я никогда не сталкивался с этим раньше? Разве это значение не должно быть установлено автоматически?
Эрик
@eric Привет, я только что обновил свой пост. Эта проблема действительно происходит с python2.7 на моем компьютере.
ROY
действительно очень интересно @ROY, у меня было настроено 2 других сервера, почти идентичных серверу, и они работали отлично
ericn
Я столкнулся с этим с помощью letsencrypt-auto и export LC_ALL=Cпомог.
Maniexx
10
Если вам интересно, что LC_ALL=Cзначит, смотрите здесь .
Гарретт
41

Запустите следующую команду (она будет работать):

export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
sudo dpkg-reconfigure locales
Rahi.Shah
источник
(-1) Команда dpkg-reconfigureпредназначена для использования в системах на основе Debian. Этот вопрос помечен centosкак производная RHEL, которая не обеспечивает поддержку dpkg, если вы не включите epel-releaseрепозиторий и не установите пакеты dpkg-devel& dpkg-dev. Даже тогда это не идеальное решение.
30

Кто-то может найти это полезным. Вы можете поместить эти настройки локали в файл .bashrc, который обычно находится в домашнем каталоге.
Просто добавьте эту команду в .bashrc:
export LC_ALL=C
затем введите source .bashrc
Теперь вам не нужно вызывать эту команду каждый раз, когда вы подключаетесь, например, через ssh.

Иван Семочкин
источник
4

Хотя вы можете установить локаль, экспортирующую переменную env, вам придется делать это каждый раз, когда вы запускаете сеанс. Установка локали таким образом решит проблему навсегда:

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 ...
CyberEd
2
@ CyberEd, вы правы, я отредактировал пример, чтобы удалить ненужные зависимости.
Марко Лавагнино
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"
...

Но мы можем не захотеть перезагружаться, чтобы вступить в силу, поэтому мы можем просто поместить его в переменную окружения в текущем сеансе оболочки:

$ . /etc/default/locale

Как насчет sudo dpkg-reconfigure locales? Если вы поэкспериментируете с этим, вы поймете, что эта команда в основном действует как графический интерфейс для упрощения описанных выше шагов, т.е. 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/....etcдля установки setlocale(), наблюдая за /etc/locale.genфайлом, а затем раскомментировать и скомпилировать его по желанию. zh_CN GB2312без точки в этом файле означает правильную строку zh_CNи zh_CN.GB2312.

Фрукты
источник
Для моей ситуации короткий ответ: 1. отредактируйте /etc/locale.gen, раскомментируйте zh_CN.UTF-8строку; 2 sudo locale-gen..
SnowOnion
2

У меня была такая же проблема, и у меня не работало ."export LC_ALL=c"

Попробуйте export 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 , если вы загрузите профиль оргии с помощью: source ~/.bash_profile.

Этот ответ довольно близок к ответам, которые я отправил на другие неидентичные, не дублирующие вопросы (т.е. не относящиеся к pipenv), но которые требуют того же решения.

Модератору: с уважением; мой предыдущий ответ был удален по этой причине, но я чувствую, что это было немного глупо, потому что на самом деле этот ответ применяется почти всякий раз, когда ошибка "проблема с языковым стандартом" ... но есть ряд различных ситуаций, языков и сред, которые могут вызвать эта ошибка.

Таким образом, А) не имеет смысла отмечать вопросы как дубликаты, а Б) не имеет смысла адаптировать ответ либо потому, что исправление очень простое, одинаковое в каждом случае и не имеет преимуществ от орнаментирования.

geoidesic
источник
1

Ubuntu:

$ sudo vi /etc/default/locale

Добавьте ниже настройки в конце файла.

LC_ALL = en_US.UTF-8

saneryee
источник