Error de configuración regional de Python: configuración de configuración regional no compatible


317

¿Por qué obtengo el siguiente error cuando hago esto en python:

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

Esto funciona con otros entornos locales como fr o nl también. Estoy usando Ubuntu 11.04.

Actualización: Hacer lo siguiente no produjo nada:

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
¿Tienes un de_DElistado en locale -a? Si no, debes instalarlo .
Bakuriu

1
Relacionado: un script bash para instalar todas las configuraciones regionales en Ubuntu.
rkrzr

12
locale.setlocale(locale.LC_ALL, 'de_DE')Está Mal. Es necesario locale.setlocale(locale.LC_ALL, 'de_DE.utf8').
Martin Thoma

2
A veces se puede descubrir una codificación disponible para el idioma / país que desee mediante el alias integrados: locale.setlocale(locale.LC_ALL, locale.locale_aliases['de_DE']).
jrgray

Respuestas:


647

Ejecute los siguientes comandos

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

Resolverá esto.

Asegúrese de hacer coincidir la .UTF-8parte con la sintaxis real que se encuentra en la salida de, locale -apor ejemplo, .utf8en algunos sistemas.


8
No tuve que usar el comando dpkg. Después de todo, si el problema ocurre localmente, entonces la solución real sería agregar los primeros dos comandos a sus aplicaciones de inicio.
RolandiXor

2
Esto no funcionó para mí. export LC_ALL="en_US.UTF-8"falló con -bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8) Lo que funcionó fue hacer esto:export LC_ALL=C
Jonathan


197

Probablemente no tenga ninguna de_DEconfiguración regional disponible.

Puede ver una lista de configuraciones regionales disponibles con el locale -acomando. Por ejemplo, en mi máquina:

$ 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

Tenga en cuenta que si desea establecer la configuración regional it_ITtambién debe especificar lo siguiente .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'

Para instalar un nuevo uso local:

sudo apt-get install language-pack-id

donde idestá el código de idioma (tomado de aquí )

Después de instalar la configuración regional, debe seguir los consejos de Julien Palard y reconfigurar las configuraciones regionales con:

sudo dpkg-reconfigure locales

Eso no funcionó en mi contenedor acoplable Debian. Pero esto funcionó. stackoverflow.com/questions/28405902/…
Chris

45

Una de las respuestas anteriores proporciona la solución:

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

El problema con la solución anterior es que debe hacerse en el shell de Linux. Sin embargo, si está proporcionando su código para trabajar en la máquina cliente, entonces este es un mal enfoque. También intenté ejecutar los comandos anteriores usando os.system (), pero aún así no funciona.

La solución que funcionó para mí es

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

32

Una solución más permanente sería completar los valores faltantes, en el resultado que se muestra mediante el comando: locale

Salida de localees:

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

Para completar los valores faltantes, edite ~ / .bashrc:

 $ vim ~/.bashrc

Agregue las siguientes líneas después del comando anterior (suponga que desea que en_US.UTF-8 sea su idioma):

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

Si este archivo es de solo lectura, deberá seguir los pasos mencionados por The GeekyBoy . La respuesta dada por el Dr. Beco en Superuser tiene detalles relacionados con el almacenamiento de archivos de solo lectura.

Después de guardar el archivo hacer:

$ source ~/.bashrc

Ahora ya no se enfrentará al mismo problema.




4

Para el registro, tuve el mismo problema, pero ninguna de las soluciones funcionó. Había actualizado mi computadora y migrado mi PC. Tenía un idioma mixto en inglés y español:

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

Pero, en mi nueva instalación de Debian, simplemente seleccioné inglés como locale. Lo que finalmente funcionó fue reconfigurar el paquete local para agregar y generar español también.

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

4

Simplemente abra el archivo .bashrc y agregue esto

exportar LC_ALL = C

y luego escriba source .bashrc en la terminal.


4

Su error dice claramente, está tratando de usar la localización algo que no estaba allí.

>>> 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: configuración regional no compatible

Para verificar la configuración disponible, use 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

para que pueda usar uno entre

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

para de_DE

Este archivo puede ajustarse manualmente o actualizarse usando la herramienta update-locale.

update-locale LANG=de_DE.UTF-8

2
  • ejecute este comando localepara obtener qué configuración regional se utiliza. Como:

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 =

  • busque la lista local listada en el primer paso del /etc/locale-genarchivo. No comentar a los usados
  • ejecutar locale-genpara generar configuraciones regionales recién agregadas

2

En mi opinión, la forma más fácil de configurar la configuración local en python {, 3} es:

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

Luego, las cosas con reconocimiento local simplemente funcionan, si estás en una distribución de Linux decente, y también deberían funcionar en distribuciones binarias de los otros sistemas operativos (o eso es un error en mi humilde opinión).

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

2

Colóquelo en la parte Dockerfilesuperior 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

Gracias, probé las otras soluciones (dpkg-reconfigure locales, locale-gen) y nada más funcionó en mi debian: 9 container. ¿Es esta realmente una / la forma estándar de crear la configuración regional en_US.UTF-8?
jamshid

Sí, creo que es la forma estándar en_US.UTF-8 locale. Cuando ejecuta localeen la terminal u obtiene `LANG = en_US.UTF-8 y otra configuración regional? stackoverflow.com/questions/36394101/…
Seenu S

1

Este error puede ocurrir si acaba de agregar una nueva configuración regional. Debe reiniciar el shell interactivo de python ( quit() y python) para acceder a él.


1

Si fuera usted, usaría BABEL: http://babel.pocoo.org/en/latest/index.html

Tengo el mismo problema aquí con Docker, he intentado cada paso y no funcionó bien, siempre obteniendo un error de configuración regional, así que decidí usar BABEL, y todo funcionó bien.


0

Al tratar de hacer que Python escupiera nombres en una localidad específica , aterricé aquí con el mismo problema.

Al buscar la respuesta, las cosas se pusieron un poco místicas.

Encontré ese código de Python.

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

Y de hecho locale.setlocale(locale.LC_TIME, 'en_DK.UTF-8')funciona

Usando consejos aquí, probé más para ver qué hay disponible usando el código 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

cuyos rendimientos

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)

De los cuales solo arriba está funcionando! Pero el en_DK.UTF-8no está en esta lista, aunque funciona. ¿¿Qué?? Y la lista de entornos locales generada por Python contiene muchos combos de da y DK, que estoy buscando, pero nuevamente no hay UTF-8 para da / DK ...

Estoy en una distribución Point Linux (basada en Debian), y aquí localedice, entre otras cosas LC_TIME="en_DK.UTF-8", que sé que funciona, pero no la configuración regional que necesito.

locale -a dice

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

Definitivamente necesito instalar otro entorno local , lo cual hice editando /etc/locale.gen, descomentando el da_DK.UTF-8 UTF-8comando de línea y ejecuciónlocale-gen

Ahora locale.setlocale(locale.LC_TIME, 'da_DK.UTF-8')también funciona, y puedo obtener mis nombres de día y mes localizados.

Mi concisión

Python: locale.locale_alias no es de ninguna ayuda para encontrar los locales disponibles !!!

Linux: es bastante fácil obtener una lista de configuración regional e instalar una nueva configuración regional. Mucha ayuda disponible.

Windows: He estado investigando un poco, pero nada concluyente. Sin embargo, hay publicaciones que conducen a respuestas, pero no he sentido la necesidad de buscarlas.


0

Si entiendo correctamente, la principal fuente de error aquí es la sintaxis exacta del nombre de la configuración regional. Especialmente porque parece diferir entre distribuciones. He visto mencionado aquí en diferentes respuestas / comentarios:

de_DE.utf8
de_DE.UTF-8

Aunque esto es obviamente lo mismo para un ser humano, lo mismo no se aplica a su algoritmo determinista estándar.

Entonces probablemente harás algo en la línea de:

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 busca .UFT-8, pero probablemente tenga .utf8 intente instalar los paquetes .UFT-8 con sudo dpkg-reconfigure locales


-2

primero, asegúrese de tener el paquete de idioma instalado haciendo:

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


sudo dpkg-reconfigure locales

el paquete de idioma inglés se instala por defecto; además, la respuesta ya se da aquí y esta carece de formato.
Skandix
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.