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

¿Por qué recibo el siguiente error al hacer esto en Python:

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

Esto funciona con otras configuraciones regionales 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 

    Ejecutar los siguientes comandos

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

    Se solucionará esto.

    Asegúrese de hacer coincidir la parte .UTF-8 con la syntax real que se encuentra en la salida del locale -a por ejemplo, .utf8 en algunos sistemas.

    Probablemente no tengas ninguna configuración regional de_DE disponible.

    Puede ver una lista de las locale -a disponibles con el comando locale -a . 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 en it_IT , también debe especificar el .utf8 :

     >>> import locale >>> locale.setlocale(locale.LC_ALL, 'it_IT') # error! Traceback (most recent call last): File "", line 1, in  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 local use:

     sudo apt-get install language-pack-id 

    donde id es 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 

    Según este enlace , se resuelve ingresando este comando:

    exportar LC_ALL = C

    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 tiene que hacerse en el shell de Linux. Sin embargo, si está proporcionando su código para trabajar en la máquina cliente, 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') 

    Una solución más permanente sería llenar los valores faltantes, en la salida que se muestra con el comando: locale

    La salida del locale es:

      $ 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, necesitaría seguir los pasos mencionados por The GeekyBoy . La respuesta dada por el Dr. Beco en Superusuario tiene detalles relacionados con el almacenamiento de archivos de solo lectura.

    Después de guardar el archivo haz:

     $ source ~/.bashrc 

    Ahora ya no estarás enfrentando el mismo problema.

    Si estás en un Debian (o en una bifurcación de Debian), puedes agregar locales usando:

     dpkg-reconfigure locales 

    En Arch Linux pude arreglar esto ejecutando sudo locale-gen

    Para el registro, tuve el mismo problema, pero ninguna de las soluciones funcionó. Había actualizado mi computadora y migrado mi PC. Tuve un local mixto de 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é el inglés como locale. Lo que finalmente funcionó fue reconfigurar el paquete de locales 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 
    • ejecute este comando locale para obtener qué configuración regional se utiliza. Como:

    LANG = en_US.UTF-8
    IDIOMA = 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 de entornos locales en el primer paso en el /etc/locale-gen . Uncomment a los usados
    • ejecuta locale-gen para generar locales recién agregados

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

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

    Entonces, la configuración local simplemente funciona, si estás en una distribución de linux decente, y también debería funcionar en distribuciones binarias de los otros sistemas operativos (o eso es un error IMHO).

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

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

    Tuve el mismo problema aquí usando Docker, probé cada paso y no funcioné bien, siempre obtenía un error de configuración regional, así que decidí usar BABEL y todo funcionó bien.

    Colóquelo en el Dockerfile sobre el 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 

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

    Al intentar que Python escupiera nombres en una ubicación específica , aterricé aquí con el mismo problema.

    En la búsqueda de la respuesta, las cosas se pusieron un poco místicas, me parece

    Encontré ese código 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 de 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 lo que solo arriba está funcionando! Pero el en_DK.UTF-8 no está en esta lista, aunque funciona!?!? ¿¿Qué?? Y la lista de configuración regional generada por python contiene una gran cantidad de 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í la locale dice entre otras 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 otra configuración regional , lo que hice editando /etc/locale.gen , sin comentar la línea necesaria da_DK.UTF-8 UTF-8 y da_DK.UTF-8 UTF-8 comando locale-gen

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

    Mi conclusión:

    Python: locale.locale_alias no es nada útil para encontrar locales disponibles.

    Linux: es bastante fácil obtener la lista de configuraciones regionales 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 las respuestas, pero no sentí la necesidad de seguirlas.

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

     de_DE.utf8 de_DE.UTF-8 

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

    Así que probablemente harás algo como:

     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 

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

     sudo apt-get install language-pack-en-base sudo dpkg-reconfigure locales