Python yerel ayarı hatası: desteklenmeyen yerel ayar


317

Python bunu yaparken neden aşağıdaki hatayı alıyorum:

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

Bu, fr veya nl gibi diğer yerel ayarlarla da çalışır. Ubuntu 11.04 kullanıyorum.

Güncelleme: Aşağıdakileri yapmak hiçbir şey vermedi:

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
Bir sen var mı de_DElistelenen locale -a? Değilse yüklemelisiniz .
13'te Bakuriu

1
İlgili: Ubuntu'ya tüm yerel ayarları yüklemek için bir bash betiği .
rkrzr

12
locale.setlocale(locale.LC_ALL, 'de_DE')Hata. Gerek locale.setlocale(locale.LC_ALL, 'de_DE.utf8').
Martin Thoma

2
Bazen kullanarak istediğiniz dil / ülke için kullanılabilir bir kodlama keşfedebilirsiniz yerleşik takma adları: locale.setlocale(locale.LC_ALL, locale.locale_aliases['de_DE']).
jrgray

Yanıtlar:


647

Aşağıdaki komutları çalıştırın

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

Bunu çözecek.

Parçayı örneğin bazı sistemlerde .UTF-8çıktıda bulunan gerçek sözdizimiyle eşleştirdiğinizden emin olun .locale -a.utf8


8
Dpkg komutunu kullanmak zorunda değildim. Sonuçta, sorun yerel olarak meydana geliyorsa, gerçek çözüm ilk iki komutu başlangıç ​​uygulamalarınıza eklemek olacaktır.
RolandiXor

2
Bu benim için işe yaramadı. export LC_ALL="en_US.UTF-8"ile başarısız -bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) çalıştı Bunun yapıyordu:export LC_ALL=C
Jonathan


197

Muhtemelen de_DEkullanılabilir bir yerel ayarınız yok .

İle yerel ayarların listesini görebilirsiniz. locale -aKomut . Örneğin, makinemde:

$ 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

Yerel ayarı ayarlamak istiyorsanız, yerel ayarı it_ITda belirtmeniz gerektiğini unutmayın..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'

Yeni bir yerel ayar yüklemek için:

sudo apt-get install language-pack-id

iddil kodu nerede ( buradan alınır )

Yerel ayarı yükledikten sonra Julien Palard tavsiyelerine uymalı ve yerel ayarları şu şekilde yeniden yapılandırmalısınız:

sudo dpkg-reconfigure locales

Bu benim Debian liman işçisi konteynırımda işe yaramadı. Ama bu işe yaradı. stackoverflow.com/questions/28405902/…
Chris

45

Yukarıdaki cevaplardan biri çözüm sağlar:

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

Yukarıdaki çözümün sorunu linux kabuğunda yapılması gerektiğidir. Ancak, kodunuzu istemci makinede çalışmak için sağlıyorsanız, bu kötü bir yaklaşımdır. Ayrıca os.system () kullanarak yukarıdaki komutları yürütmeyi denedim, ama yine de çalışmıyor.

Benim için işe yarayan çözüm

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

32

Daha kalıcı bir çözüm, komutla gösterilen çıktıda eksik değerleri doldurmak olacaktır: locale

Çıktı kaynağı 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=

Eksik değerleri doldurmak için ~ / .bashrc dosyasını düzenleyin:

 $ vim ~/.bashrc

Yukarıdaki komuttan sonra aşağıdaki satırları ekleyin (en_US.UTF-8'in diliniz olmasını istediğinizi varsayalım):

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

Bu dosya ReadOnly ise, GeekyBoy tarafından belirtilen adımları izlemeniz gerekir . Superuser'da Dr Beco tarafından verilen cevap , salt okunur dosyaları kaydetmeyle ilgili ayrıntılara sahiptir.

Dosyayı kaydettikten sonra şunları yapın:

$ source ~/.bashrc

Şimdi artık aynı problemle karşılaşmayacaksın.




4

Kayıt için aynı problemi yaşadım, ancak çözümlerin hiçbiri işe yaramadı. Bilgisayarımı yükselttim ve bilgisayarımı taşıdım. Ben bir karışık yerel ayar İngilizce ve İspanyolca vardı:

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

Ancak, yeni Debian kurulumumda, İngilizce'yi yerel ayar olarak seçtim. Sonunda çalıştı İspanyolca eklemek ve oluşturmak için yerel paketi yeniden yapılandırmak oldu.

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

4

Sadece .bashrc dosyasını açın ve ekleyin

dışa aktar LC_ALL = C

ve sonra terminalde source .bashrc yazın.


4

Hata açıkça diyor ki, orada bir şey yoktu yerel kullanmaya çalışıyorsunuz.

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

Hata: desteklenmeyen yerel ayar

Kullanılabilir ayarları kontrol etmek için 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

böylece birini kullanabilirsiniz,

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

için de_DE

Bu dosya manuel olarak ayarlanabilir veya update-locale aracı kullanılarak güncellenebilir.

update-locale LANG=de_DE.UTF-8

2
  • localekullanılan yerel ayarı almak için bu komutu çalıştırın . Gibi:

LANG = en_US.UTF-8
LANGUAGE = en_US: tr
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 = "tr_ .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-gendosyadaki ilk adımda listelenen yerel ayarlar listesini arayın . Kullanılmış olanlara rahatsızlık
  • locale-genyeni eklenen yerel ayarlar oluşturmak için çalıştır

2

Kanımca, yerel yerel ayarı python {, 3} içinde kurmanın en kolay yolu:

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

Daha sonra, yerel bir şey sadece iyi bir linux dağıtımındaysanız çalışır ve diğer işletim sistemlerinin ikili dağıtımları üzerinde de çalışmalıdır (veya bu bir hata IMHO'dur).

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

2

Yerleştirin Dockerfileyukarıda 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

Teşekkürler, diğer çözümleri denedim (dpkg-reconfigure locales, locale-gen) ve debian: 9 kapsayıcısında başka hiçbir şey işe yaramadı. Bu gerçekten en_US.UTF-8 yerel ayarını oluşturmanın standart bir yolu mu?
jamshid

Evet, bence onun standart yolu en_US.UTF-8 yerel. localeU terminalinde çalıştırdığınızda `LANG = en_US.UTF-8 ve diğer yerel ayarları al? stackoverflow.com/questions/36394101/…
Seenu S

1

Yeni bir yerel ayar eklediyseniz, bu hata oluşabilir. Erişmek için python etkileşimli kabuğunu ( quit() ve python) yeniden başlatmanız gerekir.


1

Siz olsaydım, BABEL kullanırdım: http://babel.pocoo.org/en/latest/index.html

Aynı sorunu burada Docker kullanarak aldım, her adımı denedim ve iyi çalışmadım, her zaman yerel ayar hatası aldım, bu yüzden BABEL kullanmaya karar verdim ve her şey iyi çalıştı.


0

Python belirli bir yerel isimleri tükürmek için çalışırken burada aynı sorunla indi.

Cevabı takip ederken bulduğum şeyler biraz mistik oldu.

O python kodunu buldum.

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

Ve gerçekten locale.setlocale(locale.LC_TIME, 'en_DK.UTF-8')işe yarıyor

Buradaki ipuçlarını kullanarak, python kodu kullanarak nelerin mevcut olduğunu görmek için daha fazla test yaptım

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

hangi sonuç verir

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)

Hangisi sadece yukarıda çalışıyor! Ama en_DK.UTF-8çalışıyor olsa da, bu listede değil!?!? Ne?? Ve python oluşturulan yerel liste, aradığım da ve DK'nin bir sürü kombinasyonunu içeriyor, ancak yine da / DK için UTF-8 yok ...

Point Linux dağıtımındayım (Debian tabanlı) ve burada localediğerleri arasında LC_TIME="en_DK.UTF-8"çalıştığını bildiğimi söylüyor , ama ihtiyacım olan yerel ayarı değil.

locale -a diyor

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

Yani kesinlikle düzenleyerek yaptığım diğer yerel ayarları yüklemeniz gerekiyor /etc/locale.gen, uncomment gerekli satır da_DK.UTF-8 UTF-8ve çalıştırma komutulocale-gen

Şimdi de locale.setlocale(locale.LC_TIME, 'da_DK.UTF-8')çalışıyor ve yerelleştirilmiş gün ve ay adımı alabilirim.

Sonuç:

Python: locale.locale_alias mevcut yerel ayarları bulmakta hiç de yardımcı değil !!!

Linux: Yerel ayar listesi almak ve yeni yerel ayar yüklemek oldukça kolaydır. Bir sürü yardım mevcut.

Windows: Biraz araştırıyorum ama kesin bir şey yok. Yanıtlara yol açan yazılar olsa da, bunu sürdürme dürtüsünü hissetmedim.


0

doğru anlıyorsam, buradaki ana hata kaynağı yerel ayarın tam sözdizimidir. Özellikle dağılımlar arasında farklı olduğu görülüyor. Burada farklı cevaplarda / yorumlarda bahsedildiğini gördüm:

de_DE.utf8
de_DE.UTF-8

Bu açıkça bir insan için aynı olsa da, aynı standart deterministik algoritmanız için geçerli değildir.

Yani muhtemelen aşağıdakiler boyunca bir şeyler yapacaksınız:

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 .UFT-8 arar, ancak muhtemelen .utf8 sudo dpkg-reconfigure locales ile .UFT-8 paketlerini yüklemeyi deneyin


-2

önce dil paketinin kurulu olduğundan emin olun:

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


sudo dpkg-reconfigure locales

ingilizce dil paketi varsayılan olarak yüklenir - ayrıca cevap burada zaten verilir ve bu biçimlendirme eksiktir.
Skandix
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.