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