Docker Python 设置 utf-8 语言环境

新手上路,请多包涵

我正在尝试运行我的 python 文件,该文件首先读取中文字符串并打印它。

这是我的 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"]

这是我的 python 文件:

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

然后我跑:

docker build -t python-example .

docker run python-example

我得到的错误: UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-8: ordinal not in range(128)

当我在本地运行它时,它工作正常。

原文由 jxn 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 919
2 个回答

我在使用 supervisor 和 gunicorn 部署 Django 应用程序时遇到了同样的问题。

解决它的方法是将以下行添加到我的主管配置文件中:

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

对于您的情况,请确保您要打印的中文语言环境可用并安装在您的 docker 容器中。这个 博客 描述了如何做到这一点:示例 dockerfile(使用中文语言环境而不是 en_CA.UTF-8):

 FROM ubuntu:15.10
MAINTAINER Mobify <ops@mobify.com>

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

希望这会引导您进入正确的方向。

原文由 matyas 发布,翻译遵循 CC BY-SA 3.0 许可协议

简洁版本

把这个放在你的 Dockerfile

 ENV PYTHONIOENCODING=utf-8

或者如上面评论中所述,在命令行上传递它:

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

长版:

当您启动 Python 解释器时,Python 必须设置 stdout 以便将输出发送到您的终端。在您的现代操作系统上,您的终端可能会报告它支持 UTF-8 或其他一些高级编码。您可以通过运行此命令查看使用的编码:

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

当您运行 docker 容器时,Python 期望使用更高级编码的环境变量不存在,因此 Python 将回退到基本字符集以确保兼容性。您可以通过在容器中运行相同的命令来验证这一点:

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

当我们通过 PYTHONIOENCODING 时,我们看到 sys.stdout.encoding 被适当地设置:

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

Python 文档 中阅读有关 PYTHONIOENCODING 的内容。 该答案还详细介绍了编码/解码和 stdout

原文由 aaronfay 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题