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з python 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 теж кидає ту саму помилку


2
Ви це ще читали ?
idjaw

так, у мене є @idjaw, вузол, що в моєму випадку це порожній рядок, він відрізняється від неправильної мови, яку ви вказали
ericn

Так, я це помітив. Ви спробували переконфігурувати pkg?
idjaw

мій сервер - центос, а не 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
тож це лише питання встановлення змінної середовища? Чи знаєте ви, чому я ніколи раніше з цим не стикався? Чи не слід це значення встановлювати автоматично?
ericn

@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

(-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? Якщо ви будете грати навколо нього, ви знаєте, що ця команда в основному діє як графічний інтерфейс для спрощення вищезазначених кроків, тобто Правка /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), але, можливо, вимагає того ж рішення.

До модератора: З повагою; мою попередню відповідь було видалено з цієї причини, але я вважаю, що це було трохи нерозумно, тому що дійсно ця відповідь застосовується майже всякий раз, коли помилка є "проблемою з мовою" ... але існує ряд різних ситуацій, мов та середовищ, які можуть викликати та помилка.

Таким чином, A) не має сенсу позначати питання як дублікати, а B) не має сенсу пристосовувати відповідь або тому, що виправлення дуже просте, є однаковим у кожному випадку і не має користі від орнаментації.


1

Ubuntu:

$ sudo vi /etc/default/locale

Додайте налаштування нижче в кінці файлу.

LC_ALL = en_US.UTF-8

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.