2017-03-24 84 views
0

打开码头工人实例(例如,docker run -ti ubuntu:16.04)中,创建Python文件a.pyPOSIX语言环境,UnicodeDecodeError错误

# -*- 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) 

奇怪的是,我只能在码头工人重现此

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

回答

1

内码头工人之间和泊坞窗的外面的差异很可能是LANG环境变量 - 很多很多的基本图像默认至LANG组(或LANG=C等)。设置一个明确的LANG=en_US.UTF-8将导致open正确解码源(在python 3中))。如果你想在python2中使用python 3行为,你可以使用import io并使用io.open

exec in python2/python3也允许bytes。以避免编码问题

的一种方式是从磁盘中读取源作为字节:

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

谢谢!我注意到用python3和'a = {}; ('a.py','rb')作为f:exec(f.read(),a)'(将a.py的内容存储在一个字典中),这会给出错误“ERROR - 无法将数据写入流:<_io.TextIOWrapper name =''mode ='w'encoding ='ANSI_X3.4-1968'>'。通过设置环境变量'export PYTHONIOENCODING = UTF-8'修复。 –

0

您是否试过io

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

工程用'python3',失败,'python':'语法错误:以Unicode编码string'声明。 –

2

用UTF-8语言环境开始搬运工使其成为预期的所有工作

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