POSIX语言环境,UnicodeDecodeError

打开Docker实例(例如, docker run -ti ubuntu:16.04 ),创buildPython文件a.py

 # -*- coding: utf-8 -*- a = 'ö' 

r.py

 with open('a.py') as f: exec(f.read()) 

在执行python r.py ,全是文件。 当使用python3 ,但是,一个可怕的

 Traceback (most recent call last): File "r.py", line 2, in <module> exec(f.read()) File "/usr/lib/python3.5/encodings/ascii.py", line 26, in decode return codecs.ascii_decode(input, self.errors)[0] UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 31: ordinal not in range(128) 

奇怪的是,我只能在docker上重现这一点。

任何可能出错的提示,以及如何解决? (请注意,我只能修改r.py

docker和docker之间的区别很可能是LANG环境variables – 许多基本的图像默认没有LANG set(或者LANG=C等等)。 设置一个明确的LANG=en_US.UTF-8将会导致open被正确解码(在python 3中)。 如果你想python2中的python 3行为,你可以import io并使用io.open

python2 / python3中的exec也允许bytes

避免编码问题的一种方法是以字节的forms从磁盘读取源代码:

 with open('a.py', 'rb') as f: exec(f.read()) 

使用UTF-8语言环境启动docker可以使其正常工作

 docker run -e LANG=C.UTF-8 -ti ubuntu:16.04 

你尝试过吗?

 with io.open('a.py', encoding='utf-8') as f: do stuff