Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python POSIX区域设置,UnicodeDecodeError_Python_Docker_Unicode - Fatal编程技术网

Python POSIX区域设置,UnicodeDecodeError

Python POSIX区域设置,UnicodeDecodeError,python,docker,unicode,Python,Docker,Unicode,打开docker实例(例如,docker运行-ti ubuntu:16.04),创建Python文件a.py # -*- coding: utf-8 -*- a = 'ö' with open('a.py') as f: exec(f.read()) 和r.py # -*- coding: utf-8 -*- a = 'ö' with open('a.py') as f: exec(f.read()) 执行python r.py时,所有内容都是文件。然而,当使用python3时,人们会感

打开docker实例(例如,
docker运行-ti ubuntu:16.04
),创建Python文件
a.py

# -*- coding: utf-8 -*-
a = 'ö'
with open('a.py') as f: exec(f.read())
r.py

# -*- coding: utf-8 -*-
a = 'ö'
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”,第2行,在
exec(f.read())
文件“/usr/lib/python3.5/encodings/ascii.py”,第26行,解码
返回编解码器。ascii_解码(输入,自身错误)[0]
UnicodeDecodeError:“ascii”编解码器无法解码位置31处的字节0xc3:序号不在范围内(128)
奇怪的是,我只能在docker上复制这个


关于可能出现的问题以及如何修复的任何提示?(请注意,我只能修改
r.py

您是否尝试过
io

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

您是否尝试过
io

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

使用UTF-8语言环境启动docker可以让一切按预期进行

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

使用UTF-8语言环境启动docker可以让一切按预期进行

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

内部docker和外部docker之间的区别可能是
LANG
环境变量——许多基本映像默认为no
LANG
集(或
LANG=C
等)。设置显式的
LANG=en_US.UTF-8
将导致
open
正确解码源代码(在python 3中)。如果希望python2中的python 3行为,可以
导入io
并使用
io.open

python2/python3中的
exec
也允许
字节

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

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

内部docker和外部docker之间的区别可能是
LANG
环境变量——许多基本映像默认为no
LANG
集(或
LANG=C
等)。设置显式的
LANG=en_US.UTF-8
将导致
open
正确解码源代码(在python 3中)。如果希望python2中的python 3行为,可以
导入io
并使用
io.open

python2/python3中的
exec
也允许
字节

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

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

使用
python3
,使用
python
失败:
SyntaxError:Unicode字符串中的编码声明
。使用
python3
,使用
python
失败:
SyntaxError:Unicode字符串中的编码声明
。谢谢!我注意到python3和
a={};使用open('a.py','rb')作为f:exec(f.read(),a)
(将
a.py
的内容存储在dict中),这会产生错误
错误-无法将数据写入流:
。通过设置环境变量
export pythonionecoding=UTF-8
修复。谢谢!我注意到python3和
a={};使用open('a.py','rb')作为f:exec(f.read(),a)
(将
a.py
的内容存储在dict中),这会产生错误
错误-无法将数据写入流:
。通过设置环境变量
export pythonionecoding=UTF-8
修复了此问题。