파이썬 로케일 오류 : 지원되지 않는 로케일 설정


317

파이썬에서 이것을 할 때 왜 다음과 같은 오류가 발생합니까?

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

이것은 fr이나 nl과 같은 다른 로케일에서도 작동합니다. 우분투 11.04를 사용하고 있습니다.

업데이트 : 다음을 수행해도 아무런 효과가 없었습니다.

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
de_DE목록이 locale -a있습니까? 그렇지 않은 경우 설치해야 합니다.
Bakuriu

1
관련 : 우분투에 모든 로케일을 설치 하는 bash 스크립트 .
rkrzr

12
locale.setlocale(locale.LC_ALL, 'de_DE')잘못되었습니다. 당신은 필요합니다 locale.setlocale(locale.LC_ALL, 'de_DE.utf8').
Martin Thoma

2
내장 별명을 사용하여 원하는 언어 / 국가에 대해 사용 가능한 인코딩을 발견 할 수 있습니다 locale.setlocale(locale.LC_ALL, locale.locale_aliases['de_DE']).
jrgray

답변:


647

다음 명령을 실행

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

이 문제를 해결할 것입니다.

예 를 들어 일부 시스템 .UTF-8의 출력에서 ​​찾은 실제 구문 과 부품 을 일치 시켜야합니다 .locale -a.utf8


8
dpkg 명령을 사용할 필요가 없었습니다. 결국, 문제가 로컬로 발생하는 경우 실제 해결책은 시작 응용 프로그램에 처음 두 명령을 추가하는 것입니다.
RolandiXor

2
이것은 나를 위해 작동하지 않았습니다. export LC_ALL="en_US.UTF-8"실패한 -bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) 작업 :export LC_ALL=C
Jonathan Jonathan

205

이 링크 에 따르면 다음 명령을 입력하여 해결했습니다.

LC_ALL = C 내보내기


4
무슨 뜻인가요? -그것은 환경 LC_ALL다양성을 평가에 설정 합니다.- 'C'왜 이것이 효과가 있을까요?
Martin Thoma


컴퓨터를 변경할 때마다 검색하고 시도하며 다른 방법으로는 그렇지 않지만 매번 작동합니다.
MinKi Jo

197

de_DE사용 가능한 로캘 이 없을 수 있습니다.

locale -a명령을 사용하여 사용 가능한 로케일 목록을 볼 수 있습니다 . 예를 들어, 내 컴퓨터에서 :

$ 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

로케일을 설정 it_IT하려면 다음도 지정해야합니다 .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'

새 로케일을 설치하려면 다음을 수행하십시오.

sudo apt-get install language-pack-id

여기서 id언어 코드 (에서 가져 여기 )

로케일을 설치 한 후 Julien Palard 조언을 따라 다음을 사용하여 로케일을 재구성해야합니다.

sudo dpkg-reconfigure locales

데비안 도커 컨테이너에서는 작동하지 않았습니다. 그러나 이것은 효과가있었습니다. stackoverflow.com/questions/28405902/…
Chris

45

위의 답변 중 하나가 해결책을 제공합니다.

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

위의 솔루션의 문제점은 리눅스 쉘에서 수행해야한다는 것입니다. 그러나 클라이언트 시스템에서 작동하도록 코드를 제공하는 경우 이는 나쁜 접근 방식입니다. os.system ()을 사용하여 위의 명령을 실행하려고 시도했지만 여전히 작동하지 않습니다.

나를 위해 일한 해결책은

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

32

보다 영구적 인 해결책은 명령으로 표시된 출력에서 ​​누락 된 값을 채우는 것입니다. locale

의 출력 locale은 다음과 같습니다.

 $ 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=

누락 된 값을 채우려면 ~ / .bashrc를 편집하십시오.

 $ vim ~/.bashrc

위 명령 뒤에 다음 행을 추가하십시오 (en_US.UTF-8을 사용자 언어로 지정하십시오).

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

이 파일이 읽기 전용 인 경우 The GeekyBoy에서 언급 한 단계를 따라야합니다 . Superuser에서 Dr Beco가 제공 한 답변 에는 읽기 전용 파일 저장과 관련된 세부 정보가 있습니다.

파일을 저장 한 후 다음을 수행하십시오.

$ source ~/.bashrc

이제 더 이상 같은 문제에 직면하지 않을 것입니다.




4

기록적으로, 나는 똑같은 문제가 있었지만 해결책이 없었습니다. 컴퓨터를 업그레이드하고 PC를 마이그레이션했습니다. 나는 영어와 스페인어가 혼합 된 로케일을 가졌습니다.

$ 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=

그러나 새로운 데비안 설치에서는 영어를 로케일로 선택했습니다. 마지막으로 작동하는 것은 로케일 패키지를 재구성하여 스페인어도 추가하고 생성하는 것입니다.

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

4

.bashrc 파일을 열고 이것을 추가하십시오.

LC_ALL = C 내보내기

터미널에 source .bashrc를 입력하십시오.


4

당신은 분명히 로케일을 사용하려고 노력하고 있습니다.

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

다음 중 하나를 사용할 수 있습니다.

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

...에 대한 de_DE

이 파일은 update-locale 도구를 사용하여 수동으로 조정하거나 업데이트 할 수 있습니다.

update-locale LANG=de_DE.UTF-8

2
  • locale사용되는 로케일을 얻으려면 이 명령 을 실행하십시오 . 같은 :

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 =

  • /etc/locale-gen파일의 첫 번째 단계에서 나열된 로케일 목록을 검색 하십시오. 사용한 것들에 대한 주석 해제
  • locale-gen새로 추가 된 로케일을 생성하기 위해 실행

2

제 생각에는 파이썬에서 로컬 로캘을 설정하는 가장 쉬운 방법은 다음과 같습니다.

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

그런 다음 괜찮은 리눅스 배포판에 있고 다른 OS의 바이너리 배포판에서도 작동 해야하는 로케일 인식 기능이 작동합니다 (또는 버그 IMHO).

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

2

에 배치 DockerfileENV.

# 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

고맙게도 다른 솔루션 (dpkg-reconfigure locales, locale-gen)을 시도했지만 debian : 9 컨테이너에서 아무것도 작동하지 않았습니다. 이것이 실제로 en_US.UTF-8 로켈을 만드는 표준 방법입니까?
jamshid

예, 표준 방법은 en_US.UTF-8 로켈이라고 생각합니다. locale터미널 u에서 실행 하면`LANG = en_US.UTF-8 및 기타 로케일이 있습니까? stackoverflow.com/questions/36394101/…
Seenu S

1

새 로케일을 방금 추가 한 경우이 오류가 발생할 수 있습니다. 파이썬 대화식 쉘 ( quit() 및 python) 을 다시 시작해야 액세스 할 수 있습니다.


1

내가 당신이라면 BABEL을 사용할 것입니다 : http://babel.pocoo.org/en/latest/index.html

Docker를 사용하여 동일한 문제가 발생했습니다. 모든 단계를 시도했지만 제대로 작동하지 않고 항상 로캘 오류가 발생하여 BABEL을 사용하기로 결정하고 모든 것이 잘 작동했습니다.


0

파이썬이 특정 로케일에서 이름뱉어 내려고 할 때 동일한 문제로 여기에 도착했습니다.

답을 추구하면서, 내가 찾은 약간의 신비가 생겼습니다.

그 파이썬 코드를 찾았습니다.

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

그리고 실제로 locale.setlocale(locale.LC_TIME, 'en_DK.UTF-8')작품

여기에서 팁을 사용하여 파이썬 코드를 사용하여 사용할 수있는 것을 확인하기 위해 더 테스트했습니다.

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

생산량

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)

위의 것만 작동합니다! 그러나 en_DK.UTF-8작동하지만이 목록에 없습니다!?!? 뭐?? 그리고 파이썬 생성 로케일 목록에는 내가 찾고있는 da와 DK의 많은 콤보가 포함되어 있지만 다시 da / DK에 대한 UTF-8은 없습니다 ...

나는 Point Linux 배포판 (데비안 기반)에 있으며, 여기 locale에는 LC_TIME="en_DK.UTF-8"내가 알고있는 로케일이 아니라 작동하는 것으로 알려져 있습니다.

locale -a 말한다

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

그래서 확실히 할 필요가 로케일 설치 내가 편집 한, /etc/locale.gen주석을 필요한 라인 da_DK.UTF-8 UTF-8및 실행 명령을locale-gen

이제도 locale.setlocale(locale.LC_TIME, 'da_DK.UTF-8')작동하며 현지화 된 요일 및 월 이름을 얻을 수 있습니다.

내 회의 :

Python : locale.locale_alias가 사용 가능한 로케일을 찾는 데 전혀 도움이되지 않습니다!

Linux : 로케일 목록을 얻고 새 로케일을 설치하는 것은 매우 쉽습니다. 많은 도움이 필요합니다.

Windows : 조금 조사했지만 결정적인 것은 없습니다. 답변으로 이어지는 게시물이 있지만 나는 그것을 추구하려는 충동을 느끼지 못했습니다.


0

올바르게 이해하면 여기에서 오류의 주요 원인은 로케일 이름의 정확한 구문입니다. 특히 배포판마다 다른 것처럼 보입니다. 다른 답변 / 의견에서 여기에 언급 된 것을 보았습니다.

de_DE.utf8
de_DE.UTF-8

비록 이것이 인간에게는 분명히 동일하지만 표준 결정 알고리즘에는 적용되지 않습니다.

따라서 아마도 다음 라인을 따라 무언가를 할 것입니다.

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

파이썬은 .UFT-8을 찾지 만, 아마도 .utf8은 sudo dpkg-reconfigure locales와 함께 .UFT-8 패키지를 설치하려고합니다.


-2

먼저 다음을 수행하여 언어 팩을 설치했는지 확인하십시오.

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


sudo dpkg-reconfigure locales

영어 언어 팩은 기본적으로 설치됩니다-또한 여기에 대한 답변이 이미 제공되어 있으며 형식화가 부족합니다.
Skandix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.