2017-03-24 73 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