Docker环境下Python3处理UTF-8命令行参数(argv)的问题
解决Ubuntu 18.04 Docker镜像中Python处理UTF-8命令行参数异常的问题
问题重现
你遇到的这个场景很典型:本地运行打印命令行参数的Python脚本时,中文参数输出完全正常,但打包到Ubuntu 18.04的Docker镜像后,UTF-8参数就出现了异常。
先明确下你的核心文件内容:
Python脚本(/tmp/mytest):
#!/usr/bin/env python3 print(repr(__import__("sys").argv))
Dockerfile:
FROM ubuntu:18.04 RUN apt-get update && apt-get install -y python3 RUN echo '#!/usr/bin/env python3' >> /tmp/mytest RUN echo 'print(repr(__import__("sys").argv))' >> /tmp/mytest RUN chmod +x /tmp/mytest
本地运行结果正常:
$ /tmp/mytest 我 ['/tmp/mytest', '我']
但Docker容器内运行时,中文参数会出现乱码或编码解析错误。
原因分析
问题根源在Docker容器默认的Locale设置上。Ubuntu 18.04镜像默认的Locale是C(ASCII编码),而非UTF-8。Python读取sys.argv时,会依赖系统Locale的编码规则解析命令行参数——当传入UTF-8编码的中文时,用ASCII编码去解码自然会出问题。
解决方案
这里提供三种可靠的解决办法,你可以根据场景选择:
方案1:在Dockerfile中配置UTF-8 Locale(推荐)
直接在镜像构建阶段就配置好UTF-8的Locale,让容器启动后默认使用正确的编码环境:
FROM ubuntu:18.04 # 安装locale工具并生成UTF-8 locale文件 RUN apt-get update && apt-get install -y python3 locales RUN locale-gen en_US.UTF-8 # 设置全局环境变量指定默认Locale ENV LANG en_US.UTF-8 ENV LC_ALL en_US.UTF-8 # 构建你的脚本 RUN echo '#!/usr/bin/env python3' >> /tmp/mytest RUN echo 'print(repr(__import__("sys").argv))' >> /tmp/mytest RUN chmod +x /tmp/mytest
重新构建镜像后运行,中文参数就能正常输出了。
方案2:运行容器时临时指定Locale环境变量
如果不想修改Dockerfile,可以在docker run命令中通过-e参数临时注入Locale变量:
docker run -it --rm -e LANG=en_US.UTF-8 -e LC_ALL=en_US.UTF-8 your-image-name /tmp/mytest 我
这种方式适合临时测试,或者需要灵活切换编码的场景。
方案3:在Python脚本中手动处理编码
如果无法控制容器环境,也可以在脚本内部手动修正sys.argv的编码:
#!/usr/bin/env python3 import sys import os # 强制设置UTF-8编码环境 if sys.platform.startswith('linux'): os.environ['LANG'] = 'en_US.UTF-8' # 重新解码argv:容器中默认用latin-1读取,转成utf-8 sys.argv = [arg.encode('latin-1').decode('utf-8') for arg in sys.argv] print(repr(sys.argv))
这种方式属于“脚本内兼容”,适合无法修改容器环境的场景,但不如前两种方案彻底。
内容的提问来源于stack exchange,提问作者d33tah
相关产品推荐
相关产品推荐

