pip install - locale.Error: nieobsługiwane ustawienie regionalne

232

Pełny stacktrace:

  ~ 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

Na tym samym serwerze udało mi się uruchomić pip install virtualenvz pythonem 2.7.x.

Teraz właśnie zainstalowałem Python3.4 przy użyciu 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 zgłasza ten sam błąd

ericn
źródło
2
Czytałeś to już ?
idjaw
tak, mam @idjaw, węzeł, że w moim przypadku jest to pusty ciąg znaków, różni się od niewłaściwych ustawień regionalnych, o których wspomniałeś
ericn
Tak, zauważyłem to. Próbowałeś ponownie skonfigurować pkg?
idjaw
mój serwer to centos, a nie Ubuntu @idjaw, sprawdziłem i wydaje się, że nie ma nic złego z lokalnymLANG=en_GB.utf8
ericn

Odpowiedzi:

616

Główną przyczyną jest: LC_ALLbrakuje zmiennej środowiskowej lub jest ona w jakiś sposób niepoprawna

Krótka odpowiedź-

po prostu uruchom następujące polecenie:

$ export LC_ALL=C

Jeśli błąd pojawia się w nowych oknach terminala, dodaj go u dołu .bashrcpliku.

Długa odpowiedź-

Oto moje localeustawienia:

$ 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
ROY
źródło
5
więc to tylko kwestia ustawienia zmiennej środowiskowej? Czy wiesz, dlaczego nigdy wcześniej tego nie spotkałem? Czy ta wartość nie powinna być ustawiana automatycznie?
ericn
@ eric Cześć, właśnie zaktualizowałem swój post. Ten problem występuje z python2.7 na moim komputerze.
ROY
bardzo interesujące, naprawdę @ROY, mam skonfigurowane 2 inne serwery prawie z tym indentyksem do tego serwera i nie działały one doskonale
er
Spotkałem się z tym za pomocą letsencrypt-auto i export LC_ALL=Cpomogłem.
maniexx
10
Jeśli zastanawiasz się, co to LC_ALL=Cznaczy, zobacz tutaj .
Garrett,
41

Uruchom następujące polecenie (zadziała):

export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
sudo dpkg-reconfigure locales
Rahi.Shah
źródło
(-1) dpkg-reconfigurePolecenie jest przeznaczone do użycia w systemach opartych na Debianie. To pytanie jest oznaczone centosjako pochodna RHEL, która nie zapewnia obsługi dpkg, chyba że włączysz epel-releaserepozytorium i nie zainstalujesz pakietów dpkg-devel& dpkg-dev. Nawet wtedy nie jest to idealne rozwiązanie.
30

Ktoś może uznać to za przydatne. Możesz umieścić te ustawienia regionalne w pliku .bashrc, który zwykle znajduje się w katalogu osobistym.
Po prostu dodaj to polecenie do .bashrc:
export LC_ALL=C
następnie wpisz source .bashrc
Teraz nie musisz wywoływać tego polecenia ręcznie za każdym razem, gdy na przykład łączysz się przez ssh.

Ivan Semochkin
źródło
4

Chociaż możesz ustawić ustawienia regionalne eksportujące zmienną env, musisz to zrobić za każdym razem, gdy zaczynasz sesję. Takie ustawienie regionalne rozwiąże problem na stałe:

sudo apt-get install locales
sudo locale-gen en_US.UTF-8
sudo echo "LANG=en_US.UTF-8" > /etc/default/locale
Marco Lavagnino
źródło
Czy mam nieporozumienie, czy korzystasz sudoz tej samej linii, na której próbujesz go zainstalować? sudo apt-get install ... sudo ...
CyberEd
2
@CyberEd, masz rację, zredagowałem przykład, aby usunąć niepotrzebne zależności.
Marco Lavagnino
3

[Ta odpowiedź jest skierowana tylko na platformę Linux]

Pierwszą rzeczą, którą powinieneś wiedzieć, jest to, że większość ścieżek zlokalizowanych w pliku konfiguracyjnym ustawień regionalnych można uzyskać z 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>

Widzisz ostatni /usr/share/i18n? Tutaj znajduje się plik konfiguracyjny 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

Co teraz ? Musimy je skompilować do archiwum binarnego. Jednym ze sposobów, np. Zakładając, że mam /usr/share/i18n/locales/en_LOVE, mogę dodać go do listy kompilacji, tzn. Do /etc/locale-genpliku:

$ tail -1 /etc/locale.gen 
en_LOVE.UTF-8 UTF-8

I skompiluj go do pliku binarnego za pomocą 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.

A teraz zaktualizować domyślne ustawienia regionalne systemu z pożądane LANG, LC_ALL... etc z tego update-locale:

sudo update-locale LANG=en_LOVE.UTF-8

update-localew rzeczywistości oznacza również aktualizację tego /etc/default/localepliku, który będzie pobierany przez system podczas logowania, aby skonfigurować zmienne środowiskowe:

$ head /etc/default/locale 
#  File generated by update-locale
LANG=en_LOVE.UTF-8
LC_NUMERIC="en_US.UTF-8"
...

Ale możemy nie chcieć restartować, aby zadziałać, więc możemy po prostu pobrać go do zmiennej środowiskowej w bieżącej sesji powłoki:

$ . /etc/default/locale

Jak o sudo dpkg-reconfigure locales? Jeśli się wokół niego obejrzysz, będziesz wiedział, że to polecenie działa w zasadzie jako GUI, aby uprościć powyższe kroki, tj. Edycja /etc/locale.gen->sudo locale-gen ->sudo update-locale LANG=en_LOVE.UTF-8

Dla Pythona, o ile /etc/locale.genzawiera on tego kandydata locale i locale.genzostanie skompilowany, setlocale(category, locale)powinien działać bez rzucania locale.Error: unsupoorted locale setting. Możesz sprawdzić poprawny ciąg en_US.UTF-8/ en_US/....etcdo ustawienia setlocale(), obserwując /etc/locale.genplik, a następnie cofnąć komentarz i skompilować go zgodnie z potrzebami. zh_CN GB2312bez kropki w tym pliku oznacza, że ​​poprawny ciąg to zh_CNi zh_CN.GB2312.

Owoc
źródło
W mojej sytuacji krótka odpowiedź brzmi: 1. edytuj /etc/locale.gen, odkomentuj zh_CN.UTF-8wiersz; 2 sudo locale-gen.
SnowOnion
2

Miałem ten sam problem i nie działałem dla mnie ."export LC_ALL=c"

Spróbuj export LC_ALL="en_US.UTF-8"(zadziała).

Benyamin Jafari
źródło
1

Komunikat o błędzie wskazuje na problem z ustawieniem regionalnym. Aby to naprawić, jak wskazują inne odpowiedzi, musisz zmodyfikować ustawienia regionalne.

W systemie Mac OS X Sierra odkryłem, że najlepszym sposobem na to jest zmodyfikowanie ~/bash_profilepliku w następujący sposób:

export LANG="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"

Ta zmiana nie będzie natychmiast widoczna w bieżącej sesji cli chyba odświeżyć profil bash za pomocą: source ~/.bash_profile.

Ta odpowiedź jest dość zbliżona do odpowiedzi, które zamieściłem na inne nieidentyczne, niepubliczne pytania (tj. Niezwiązane z pipenv), ale które wymagają tego samego rozwiązania.

Do moderatora: z szacunkiem; moja poprzednia odpowiedź została usunięta z tego powodu, ale wydaje mi się, że to było trochę głupie, ponieważ tak naprawdę ta odpowiedź ma zastosowanie prawie zawsze, gdy błąd dotyczy „problemu z ustawieniami regionalnymi” ... ale istnieje wiele różnych sytuacji, języków i środowisk, które mogą powodować ten błąd.

Zatem A) nie ma sensu oznaczać pytań jako duplikaty, a B) nie ma sensu dostosowywać odpowiedzi, ponieważ poprawka jest bardzo prosta, jest taka sama w każdym przypadku i nie korzysta z ozdób.

geoidesowe
źródło
1

Ubuntu:

$ sudo vi /etc/default/locale

Dodaj poniższe ustawienie na końcu pliku.

LC_ALL = en_US.UTF-8

saneryee
źródło