web-dev-qa-db-fra.com

Docker Python définit les paramètres régionaux utf-8

J'essaie de lancer mon fichier python qui lit d'abord une chaîne en chinois et de l'imprimer.

C'est mon Dockerfile

FROM python:2.7-onbuild
ENV LANG en_US.UTF-8
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

Ceci est mon fichier python:

    # -*- coding: utf-8 -*-
    import jieba
    s = "我来到北京清华大学"
    s = s.decode('utf-8')
    print type(s), s

Je cours ensuite:

docker build -t python-example .

docker run python-example

Erreur j'ai obtenu: UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordinal not in range(128)

Quand je l'exécute localement, cela fonctionne bien. 

7
jxn

J'ai rencontré le même problème lorsque je déployais une application Django avec superviseur et gunicorn. 

Ce qui a été corrigé, c'est d'ajouter la ligne suivante à mon fichier de configuration superviseur:

environment=LANG="es_ES.utf8", LC_ALL="es_ES.UTF-8", LC_LANG="es_ES.UTF-8"

Pour votre cas, assurez-vous que les paramètres régionaux chinois que vous souhaitez imprimer sont disponibles et installés dans votre conteneur de menu fixe. Ce blog décrit comment faire: Example dockerfile (utilisez les paramètres régionaux chinois à la place de en_CA.UTF-8):

FROM ubuntu:15.10
MAINTAINER Mobify <[email protected]>

RUN apt-get -qq update && \
    apt-get -q -y upgrade && \
    apt-get install -y Sudo curl wget locales && \
    rm -rf /var/lib/apt/lists/*

# Ensure that we always use UTF-8 and with Canadian English locale
RUN locale-gen en_CA.UTF-8

COPY ./default_locale /etc/default/locale
RUN chmod 0755 /etc/default/locale

ENV LC_ALL=en_CA.UTF-8
ENV LANG=en_CA.UTF-8
ENV LANGUAGE=en_CA.UTF-8

espérons que cela vous mène dans la bonne direction.

12
matyas

Version courte

Mettez ceci dans votre Dockerfile:

ENV PYTHONIOENCODING=utf-8

ou comme mentionné dans les commentaires ci-dessus, transmettez-le en ligne de commande:

docker run -e PYTHONIOENCODING=utf-8 my-python-image some-command

Version longue:

Lorsque vous démarrez l'interpréteur Python, Python doit configurer stdout pour pouvoir envoyer la sortie à votre terminal. Sur votre système d'exploitation moderne, votre terminal indique probablement qu'il prend en charge UTF-8 ou un autre encodage avancé. Vous pouvez voir quel encodage est utilisé en exécutant cette commande:

$ python -c 'import sys; print(sys.stdout.encoding)'
UTF-8

Lorsque vous exécutez un conteneur de menu fixe, les variables d'environnement que Python s'attend à utiliser ne sont pas présentes. Par conséquent, Python utilisera un jeu de caractères de base pour garantir la compatibilité. Vous pouvez le vérifier en exécutant la même commande dans votre conteneur:

$ docker run my-python-image python -c 'import sys; print(sys.stdout.encoding)'
ANSI_X3.4-1968

Lorsque nous passons PYTHONIOENCODING, nous voyons que le sys.stdout.encoding est correctement défini:

$ docker run -e PYTHONIOENCODING=UTF-8 my-python-image python -c 'import sys; print(sys.stdout.encoding)'
UTF-8

Lisez à propos de PYTHONIOENCODING dans la documentation Python . Cette réponse contient également beaucoup de détails sur l'encodage/décodage et stdout .

10
aaronfay

J'ajoute la commande ci-dessous dans mon fichier docker:

RUN locale-gen en_US.UTF-8
ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en' LC_ALL='en_US.UTF-8'

puis construisez/reconstruisez les images du menu fixe, vous feriez mieux de l'ajouter à l'image de base.

1
Jayhello