webentwicklung-frage-antwort-db.com.de

Python-Gebietsschemafehler: nicht unterstützte Gebietsschemaeinstellung

Warum bekomme ich in Python die folgende Fehlermeldung:

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

Dies funktioniert auch mit anderen Gebietsschemas wie fr oder nl. Ich verwende Ubuntu 11.04.

Update: Folgende Maßnahmen haben nichts ergeben:

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

Führen Sie die folgenden Befehle aus

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

Es wird das lösen.

Stellen Sie sicher, dass der .UTF-8-Teil der tatsächlichen Syntax in der Ausgabe von locale -a entspricht, z. .utf8 auf einigen Systemen.

527
Muhammad Hassan

Sie verfügen wahrscheinlich nicht über ein de_DE-Gebietsschema.

Sie können eine Liste der verfügbaren Ländereinstellungen mit dem Befehl locale -a anzeigen Zum Beispiel auf meinem Computer:

$ 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

Wenn Sie das Gebietsschema auf it_IT setzen möchten, müssen Sie auch .utf8 angeben:

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

So installieren Sie ein neues Gebietsschema:

Sudo apt-get install language-pack-id

wobei id der Sprachcode ist (aus hier )

Nachdem Sie das Gebietsschema installiert haben, sollten Sie den Empfehlungen von Julien Palard folgen und die Gebietsschemas mit dem folgenden Befehl neu konfigurieren:

Sudo dpkg-reconfigure locales
176
Bakuriu

Gemäß diesem Link wird es durch Eingabe dieses Befehls gelöst:

export LC_ALL = C

148

Eine der obigen Antworten bietet die Lösung:

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

Das Problem bei der obigen Lösung besteht darin, dass sie auf der Linux-Shell ausgeführt werden muss. Wenn Sie jedoch Ihren Code für die Arbeit auf dem Client-Computer bereitstellen, ist dies ein schlechter Ansatz. Ich habe auch versucht, die obigen Befehle mit os.system () auszuführen, aber es funktioniert immer noch nicht.

Eine Lösung, die für mich funktioniert hat

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

Eine dauerhaftere Lösung wäre das Ausfüllen der fehlenden Werte in der Ausgabe, die durch den Befehl angezeigt wird: locale

Ausgabe von locale ist: 

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

Um die fehlenden Werte zu füllen, bearbeiten Sie ~/.bashrc: 

 $ vim ~/.bashrc

Fügen Sie nach dem obigen Befehl die folgenden Zeilen hinzu (angenommen, Sie möchten, dass en_US.UTF-8 Ihre Sprache ist):

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

Wenn es sich bei dieser Datei um ReadOnly handelt, müssen Sie die unter The GeekyBoy genannten Schritte ausführen. Die Antwort von Dr. Beco in Superuser enthält Details zum Speichern von Readonly-Dateien.

Nach dem Speichern der Datei:

$ source ~/.bashrc

Jetzt stehen Sie nicht mehr vor demselben Problem.

31
lorenzofeliz

Wenn Sie sich in einem Debian (oder Debian-Zweig) befinden, können Sie Ländereinstellungen hinzufügen, indem

dpkg-reconfigure locales
10
Julien Palard

In Arch Linux konnte ich dies beheben, indem ich Sudo locale-gen ausführte.

5
Keith Smiley

Für das Protokoll hatte ich das gleiche Problem, aber keine der Lösungen funktionierte ... Ich hatte meinen Computer aufgerüstet und meinen PC migriert. Ich hatte ein gemischtes lokales Englisch und Spanisch:

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

Aber bei meiner neuen Debian-Installation habe ich gerade Englisch als Gebietsschema ausgewählt. Letztendlich funktionierte es, das locales-Paket zu rekonfigurieren, um auch spanisch hinzuzufügen und zu generieren.

$ grep -v "#" /etc/locale.gen 
en_US.UTF-8 UTF-8
es_ES.UTF-8 UTF-8
3
kikeenrique
  • führen Sie diesen Befehl aus locale, um zu ermitteln, welches Gebietsschema verwendet wird. Sowie:

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

  • suchen Sie im ersten Schritt in der /etc/locale-gen-Datei nach der aufgelisteten Liste der Ländereinstellungen. Unkommentiert zu gebrauchten
  • führen Sie locale-gen aus, um neu hinzugefügte Ländereinstellungen zu generieren
2
andy

Wenn ich Sie wäre, würde ich BABEL verwenden: http://babel.pocoo.org/de/latest/index.html

Ich habe das gleiche Problem mit Docker hier gemacht, ich habe jeden einzelnen Schritt ausprobiert und funktionierte nicht gut. Ich bekam immer einen lokalen Fehler und entschied mich daher für BABEL. Alles funktionierte gut. 

1
Carlos

Meiner Meinung nach ist der einfachste Weg, das lokale Gebietsschema in Python {, 3} einzurichten:

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

Das Gebietsschema-fähige Material funktioniert einfach, wenn Sie sich in einer anständigen Linux-Distribution befinden und auch mit Binärdistributionen der anderen Betriebssysteme arbeiten sollten (oder IMHO ein Fehler).

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

Platziere es in der Dockerfile über der 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
1
seenu s

Beim Versuch, Python dazu zu bringen, Namen in einem bestimmten Gebietsschema auszuspucken bin ich hier mit demselben Problem gelandet.

Bei der Verfolgung der Antwort wurden die Dinge ein wenig mystisch, finde ich.

Ich habe diesen Python-Code gefunden.

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

Und tatsächlich funktioniert locale.setlocale(locale.LC_TIME, 'en_DK.UTF-8')

Mit Tipps hier habe ich weiter getestet, was mit Python-Code verfügbar ist

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

was ergibt

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  ([email protected])
SUCCES set en_US.UTF-8  ([email protected])
SUCCES set C            (posix)
SUCCES set C            (english_united-states.437)
SUCCES set en_US.UTF-8  (universal)

Davon funktioniert nur oben! Aber der en_DK.UTF-8 ist nicht in dieser Liste, obwohl es funktioniert!?!? Was ?? Und die Python-erzeugte Gebietsschema-Liste enthält viele Kombinationen von da und DK, die ich suche, aber wieder kein UTF-8 für da/DK ...

Ich bin auf einer Point Linux-Distribution (Debian-basiert), und hier sagt locale unter anderem LC_TIME="en_DK.UTF-8", was ich weiß, funktioniert, aber nicht das benötigte Gebietsschema.

locale -a sagt

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

Also muss auf jeden Fall ein anderes Gebietsschema installiert werden , was ich durch Editieren von /etc/locale.gen getan habe, die Kommentarzeichen für die erforderliche Zeile da_DK.UTF-8 UTF-8 und der Befehl locale-gen

Jetzt funktioniert auch locale.setlocale(locale.LC_TIME, 'da_DK.UTF-8') und ich kann meine lokalisierten Tages- und Monatsnamen abrufen.

Mein Fazit:

Python: locale.locale_alias ist überhaupt nicht hilfreich bei der Suche nach verfügbaren Locales !!!

Linux: Es ist ziemlich einfach, die Gebietsschema-Liste abzurufen und ein neues Gebietsschema zu installieren. Viel Hilfe zur Verfügung.

Windows: Ich habe ein wenig nachgeforscht, aber nichts schlüssiges. Es gibt zwar Beiträge, die zu Antworten führen, aber ich habe nicht den Drang verspürt, sie zu verfolgen.

0
DonPedro

Öffnen Sie einfach die .bashrc-Datei und fügen Sie diese hinzu

export LC_ALL = C

geben Sie dann im Terminal source .bashrc ein.

0
Saroj Rai

Dieser Fehler kann auftreten, wenn Sie gerade ein neues Gebietsschema hinzugefügt haben. Sie müssen die interaktive Python-Shell (quit() und python) neu starten, um darauf zugreifen zu können.

0
Drunken Master

wenn ich es richtig verstanden habe, ist die Hauptfehlerquelle hier die genaue Syntax des Gebietsschemas. Zumal es scheint, dass es zwischen den Distributionen zu unterscheiden scheint. Ich habe hier in verschiedenen Antworten/Kommentaren erwähnt:

de_DE.utf8
de_DE.UTF-8

Auch wenn dies offensichtlich für einen Menschen dasselbe ist, gilt dies nicht für Ihren deterministischen Standardalgorithmus.

Sie werden also wahrscheinlich etwas in der Art von tun:

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