打开泊坞窗实例(例如docker run -ti ubuntu:16.04
),创建Python文件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
。)
答案 0 :(得分:2)
使用UTF-8语言环境启动docker使其全部按预期工作
docker run -e LANG=C.UTF-8 -ti ubuntu:16.04
答案 1 :(得分:1)
内部docker和docker之外的区别可能是LANG
环境变量 - 许多基本图像默认为没有设置LANG
(或LANG=C
等)。设置显式LANG=en_US.UTF-8
将导致open
正确解码源(在python 3中))。如果你想在python2中使用python 3行为,你可以import io
并使用io.open
。
exec
也允许bytes
。
避免编码问题的一种方法是从磁盘读取源:字节:
with open('a.py', 'rb') as f:
exec(f.read())
答案 2 :(得分:0)
您是否尝试过io
?
with io.open('a.py', encoding='utf-8') as f:
do stuff