Błąd ustawień regionalnych Python: nieobsługiwane ustawienie regionalne


317

Dlaczego pojawia się następujący błąd podczas wykonywania tego w Pythonie:

>>> import locale
>>> print str( locale.getlocale() )
(None, None)
>>> locale.setlocale(locale.LC_ALL, 'de_DE')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/locale.py", line 531, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting

Działa to również z innymi lokalizacjami, takimi jak fr lub nl. Używam Ubuntu 11.04.

Aktualizacja: Wykonanie następujących czynności nic nie dało:

dpkg-reconfigure locales
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_CTYPE = "UTF-8",
    LANG = (unset)
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

8
Czy masz na de_DEliście locale -a? Jeśli nie, musisz go zainstalować .
Bakuriu

1
Powiązane: skrypt bash do zainstalowania wszystkich lokalizacji na Ubuntu.
rkrzr

12
locale.setlocale(locale.LC_ALL, 'de_DE')jest źle. Trzeba locale.setlocale(locale.LC_ALL, 'de_DE.utf8').
Martin Thoma,

2
Czasami można odkryć dostępne kodowanie języka / kraju chcesz za pomocą wbudowanego w aliasów: locale.setlocale(locale.LC_ALL, locale.locale_aliases['de_DE']).
jrgray

Odpowiedzi:


647

Uruchom następujące polecenia

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

Rozwiąże to.

Pamiętaj, aby dopasować .UTF-8część do faktycznej składni znalezionej w danych wyjściowych locale -anp. W .utf8niektórych systemach.


8
Nie musiałem używać polecenia dpkg. W końcu, jeśli problem występuje lokalnie, prawdziwym rozwiązaniem byłoby dodanie dwóch pierwszych poleceń do aplikacji startowych.
RolandiXor

2
To mi nie zadziałało. export LC_ALL="en_US.UTF-8"nie powiodło się Z tym, -bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) co działało, robiąc to:export LC_ALL=C
Jonathan

204

Zgodnie z tym linkiem rozwiązano go, wprowadzając następujące polecenie:

eksport LC_ALL = C


4
Co to znaczy? - ok, ustawia zmienne środowiskowe LC_ALLna wartość 'C'- ale dlaczego miałoby to działać?
Martin Thoma,


Wyszukuję i próbuję to za każdym razem, gdy zmieniam komputer, i działa to za każdym razem, gdy inne metody tego nie robią.
MinKi Jo

197

Prawdopodobnie nie masz de_DEdostępnych ustawień regionalnych.

Za pomocą polecenia możesz wyświetlić listę dostępnych ustawień regionalnych locale -a. Na przykład na moim komputerze:

$ locale -a
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
it_CH.utf8
it_IT.utf8
POSIX

Pamiętaj, że jeśli chcesz ustawić ustawienia regionalne it_IT, musisz także określić .utf8:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'it_IT')   # error!
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/locale.py", line 539, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting
>>> locale.setlocale(locale.LC_ALL, 'it_IT.utf8')
'it_IT.utf8'

Aby zainstalować nowe ustawienia regionalne, użyj:

sudo apt-get install language-pack-id

gdzie idjest kod języka (wzięty stąd )

Po zainstalowaniu ustawień regionalnych postępuj zgodnie z zaleceniami Juliena Palarda i ponownie skonfiguruj ustawienia regionalne za pomocą:

sudo dpkg-reconfigure locales

To nie działało w moim kontenerze dokującym Debiana. Ale to zadziałało. stackoverflow.com/questions/28405902/…
Chris

45

Jedna z powyższych odpowiedzi stanowi rozwiązanie:

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

Problem z powyższym rozwiązaniem polega na tym, że należy to zrobić na powłoce Linux-a. Jeśli jednak udostępniasz kod do pracy na komputerze klienckim, jest to złe podejście. Próbowałem również wykonać powyższe polecenia za pomocą os.system (), ale nadal nie działa.

Rozwiązaniem, które działało dla mnie jest

locale.setlocale(locale.LC_ALL,'en_US.UTF-8')

32

Trwałym rozwiązaniem byłoby uzupełnienie brakujących wartości w danych wyjściowych pokazanych poleceniem: locale

Dane wyjściowe localeto:

 $ locale
LANG=en_US.utf8
LANGUAGE=
LC_CTYPE="en_US.utf8"
LC_NUMERIC=es_ES.utf8
LC_TIME=es_ES.utf8
LC_COLLATE="en_US.utf8"
LC_MONETARY=es_ES.utf8
LC_MESSAGES="en_US.utf8"
LC_PAPER=es_ES.utf8
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT=es_ES.utf8
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

Aby uzupełnić brakujące wartości, edytuj ~ / .bashrc:

 $ vim ~/.bashrc

Dodaj następujące wiersze po powyższym poleceniu (załóżmy, że chcesz, aby en_US.UTF-8 był twoim językiem):

export LANGUAGE="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"

Jeśli ten plik jest tylko do odczytu, będziesz musiał wykonać kroki wymienione przez The GeekyBoy . Odpowiedź udzielona przez dr Beco w Superuser zawiera szczegółowe informacje dotyczące zapisywania plików tylko do odczytu.

Po zapisaniu pliku wykonaj:

$ source ~/.bashrc

Teraz już nie będziesz mieć do czynienia z tym samym problemem.




4

Dla przypomnienia, miałem ten sam problem, ale żadne z rozwiązań nie zadziałało. Zaktualizowałem komputer i przeprowadziłem migrację komputera. Miałem mieszany lokalny angielski i hiszpański:

$ locale
LANG=en_US.utf8
LANGUAGE=
LC_CTYPE="en_US.utf8"
LC_NUMERIC=es_ES.utf8
LC_TIME=es_ES.utf8
LC_COLLATE="en_US.utf8"
LC_MONETARY=es_ES.utf8
LC_MESSAGES="en_US.utf8"
LC_PAPER=es_ES.utf8
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT=es_ES.utf8
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=

Ale w mojej nowej instalacji Debiana właśnie wybrałem język angielski jako lokalizację. To, co w końcu zadziałało, polegało na ponownej konfiguracji pakietu locales, aby dodać i wygenerować również hiszpański.

$ grep -v "#" /etc/locale.gen 
en_US.UTF-8 UTF-8
es_ES.UTF-8 UTF-8

4

Po prostu otwórz plik .bashrc i dodaj go

eksport LC_ALL = C

a następnie wpisz source .bashrc w terminalu.


4

Twój błąd wyraźnie mówi, że próbujesz użyć ustawień regionalnych czegoś tam nie było.

>>> locale.setlocale(locale.LC_ALL, 'de_DE')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/locale.py", line 581, in setlocale
    return _setlocale(category, locale)
locale.Error: unsupported locale setting

locale.Error: nieobsługiwane ustawienie regionalne

Aby sprawdzić dostępne ustawienia, użyj locale -a

deb@deb-Latitude-E7470:/ambot$ locale -a
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
POSIX

więc możesz użyć jednego z nich,

>>> locale.setlocale(locale.LC_ALL, 'en_AG.utf8')
'en_AG.utf8'
>>> 

dla de_DE

Ten plik można dostosować ręcznie lub zaktualizować za pomocą narzędzia update-locale.

update-locale LANG=de_DE.UTF-8

2
  • uruchom to polecenie, localeaby uzyskać informacje o używanych ustawieniach regionalnych. Jak na przykład:

LANG = en_US.UTF-8
LANGUAGE = en_US: en
LC_CTYPE = zh_CN.UTF-8
LC_NUMERIC = "en_US.UTF-8"
LC_TIME = "en_US.UTF-8"
LC_COLLATE = "en_US.UTF-8"
LC_MONETARY = "en_US .UTF-8 "
LC_MESSAGES =" en_US.UTF-8 "
LC_PAPER =" en_US.UTF-8 "
LC_NAME =" en_US.UTF-8 "
LC_ADDRESS =" en_US.UTF-8 "
LC_TELEPHONE =" en_US.UTF-8 "
LC_MEASUREMENT = "en_US.UTF-8"
LC_IDENTIFICATION = "en_US.UTF-8"
LC_ALL =

  • wyszukaj listę ustawionych lokalizacji w pierwszym kroku /etc/locale-genpliku. Odkomentowanie używanych
  • uruchom, locale-genaby wygenerować nowo dodane ustawienia narodowe

2

Moim zdaniem najłatwiejszym sposobem ustawienia lokalnych ustawień regionalnych w python {, 3} jest:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'de_DE.UTF-8'

Następnie rzeczy zorientowane na ustawienia regionalne po prostu działają, jeśli masz przyzwoitą dystrybucję linuksową i powinny działać również na dystrybucjach binarnych innych systemów operacyjnych (lub to jest błąd IMHO).

>>> import datetime as dt
>>> print(dt.date.today().strftime("%A %d. %B %Y"))
Sonntag 11. Dezember 2016

2

Umieść go Dockerfilepowyżej ENV.

# make the "en_US.UTF-8" locale so postgres will be utf-8 enabled by default
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
    && localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8

ENV LANG en_US.UTF-8

Dzięki, wypróbowałem inne rozwiązania (ustawienia regionalne dpkg-rekonfiguruj, locale-gen) i nic więcej nie działało w moim kontenerze debian: 9. Czy to naprawdę / standardowy sposób tworzenia ustawień regionalnych en_US.UTF-8?
jamshid

Tak, myślę, że to standardowa metoda ustawień regionalnych en_US.UTF-8. Po uruchomieniu localew terminalu dostajesz `LANG = en_US.UTF-8 i inne ustawienia regionalne? stackoverflow.com/questions/36394101/…
Seenu S

1

Ten błąd może wystąpić, jeśli właśnie dodałeś nowe ustawienia regionalne. Musisz ponownie uruchomić interaktywną powłokę Pythona ( quit() i python), aby uzyskać do niej dostęp.


1

Gdybym był tobą, użyłbym BABEL: http://babel.pocoo.org/en/latest/index.html

Mam ten sam problem przy użyciu Dockera, próbowałem każdego kroku i nie działałem dobrze, zawsze pojawiał się błąd lokalizacji, więc zdecydowałem się użyć BABEL i wszystko działało dobrze.


0

Próbując zmusić Pythona do wyplucia nazw w określonych lokalizacjach , wylądowałem tutaj z tym samym problemem.

Szukając odpowiedzi, sprawy stały się trochę mistyczne.

Znalazłem ten kod python.

import locale
print locale.getdefaultlocale()
>> ('en_DK', 'UTF-8')

I rzeczywiście locale.setlocale(locale.LC_TIME, 'en_DK.UTF-8') działa

Korzystając ze wskazówek, przetestowałem dalej, aby zobaczyć, co jest dostępne przy użyciu kodu python

import locale
loc_list = [(a,b) for a,b in locale.locale_alias.items() ]
loc_size = len(loc_list)
print loc_size,'entries'

for loc in loc_list:
    try:
        locale.setlocale(locale.LC_TIME, loc[1])
        print 'SUCCES set {:12} ({})'.format(loc[1],loc[0])
    except:
        pass

co daje

858 entries
SUCCES set en_US.UTF-8  (univ)
SUCCES set C            (c.ascii)
SUCCES set C            (c.en)
SUCCES set C            (posix-utf2)
SUCCES set C            (c)
SUCCES set C            (c_c)
SUCCES set C            (c_c.c)
SUCCES set en_IE.UTF-8  (en_ie.utf8@euro)
SUCCES set en_US.UTF-8  (universal.utf8@ucs4)
SUCCES set C            (posix)
SUCCES set C            (english_united-states.437)
SUCCES set en_US.UTF-8  (universal)

Z których tylko powyższe działa! Aleen_DK.UTF-8 nie ma go na tej liście, chociaż działa!?!? Co?? A lista ustawień narodowych wygenerowana w Pythonie zawiera wiele kombinacji da i DK, których szukam, ale znowu nie ma UTF-8 dla da / DK ...

Jestem na dystrybucji Linuksa Point (opartej na Debianie), a tutaj localemówi między innymi LC_TIME="en_DK.UTF-8", że wiem, że działa, ale nie w lokalizacji, której potrzebuję.

locale -a mówi

C
C.UTF-8
en_DK.utf8
en_US.utf8
POSIX

Więc zdecydowanie muszę zainstalować inne ustawienia regionalne , co zrobiłem przez edycję /etc/locale.gen, odkomentowanie potrzebnej linii da_DK.UTF-8 UTF-8i uruchomienie polecenialocale-gen

Teraz locale.setlocale(locale.LC_TIME, 'da_DK.UTF-8') też działa i mogę uzyskać moje zlokalizowane nazwy dni i miesięcy.

Moja konkluzja:

Python: locale.locale_alias wcale nie jest pomocny w wyszukiwaniu dostępnych ustawień regionalnych !!!

Linux: bardzo łatwo jest uzyskać listę ustawień regionalnych i zainstalować nowe ustawienia regionalne. Dostępna jest duża pomoc.

Windows: Trochę badałem, ale nic rozstrzygającego. Są jednak posty prowadzące do odpowiedzi, ale nie odczuwałem potrzeby, by je realizować.


0

jeśli dobrze rozumiem, głównym źródłem błędu jest dokładna składnia nazwy ustawienia narodowego. Zwłaszcza, że ​​wydaje się różnić między dystrybucjami. Wspomniałem tutaj w różnych odpowiedziach / komentarzach:

de_DE.utf8
de_DE.UTF-8

Chociaż jest to oczywiście to samo dla człowieka, to samo nie dotyczy standardowego algorytmu deterministycznego.

Prawdopodobnie zrobisz coś w stylu:

DESIRED_LOCALE=de
DESIRED_LOCALE_COUNTRY=DE
DESIRED_CODEPAGE_RE=\.[Uu][Tt][Ff].?8
if [ $(locale -a | grep -cE "${DESIRED_LOCALE}_${DESIRED_LOCALE_COUNTRY}${DESIRED_CODEPAGE_RE}") -eq 1 ]
then
    export LC_ALL=$(locale -a | grep -m1 -E "${DESIRED_LOCALE}_${DESIRED_LOCALE_COUNTRY}${DESIRED_CODEPAGE_RE}")
    export LANG=$LC_ALL
else
    echo "Not exactly one desired locale definition found: $(locale -a | grep -E "${DESIRED_LOCALE}_${DESIRED_LOCALE_COUNTRY}${DESIRED_CODEPAGE_RE}")" >&2
fi

0

python szuka .UFT-8, ale prawdopodobnie masz .utf8 spróbuj zainstalować pakiety .UFT-8 z sudo dpkg-rekonfiguruj ustawienia regionalne


-2

najpierw upewnij się, że masz zainstalowany pakiet językowy, wykonując:

sudo apt-get install language-pack-en-base


sudo dpkg-reconfigure locales

angielski pakiet językowy jest instalowany domyślnie - ponadto odpowiedź jest już tutaj podana, a tej brakuje sformatowania.
Skandix
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.