PyCharm 远程解释器是否引入了编码问题?
Does PyCharm remote interpreter introduced encoding issue?
我有下面这段代码报错:
def get_name(self, name_dir):
name = {}
for cnt, line in enumerate(open(name_dir, 'r')):
id, gname = line.strip().split('\t')
name[id] = gname
return name
错误信息:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 27: ordinal not in range(128)
我在 Mac 和 Ubuntu 机器上 运行 在 python3 本地,没有错误。但是,当我在 PyCharm 中设置远程解释器以在 ubuntu 机器上使用相同的 python3 解释器时,它会报告错误。
我通过将 encoding='utf8' 添加到文件 'open' 函数来解决问题。这是否意味着 PyCharm 在配置远程解释器时引入了错误?
不,PyCharm 做它应该做的事情。
问题是 你在 Mac 和 Ubuntu 上都在本地尝试过,这很好,但这隐藏了你的本地计算机有 locales,可能支持UTF-8,但远程计算机不支持。
现在,默认情况下,大多数 Linux 发行版都会使用 UTF-8 语言环境安装用户,所以我假设两者之一(从我的角度来看,第二种更有可能):
您安装 Ubuntu 时使用的图像非常小,没有很多(或任何)语言环境。或者您要使用的语言环境未安装,Ubuntu 只找到默认语言环境作为回退(C
语言环境)。
或者您正在使用 root。 Root 通常(并且为了可移植性)仅使用 C
语言环境,它仅支持 ASCII 字符集。
因此,我假设在您的远程计算机中您没有使用 UTF-8 语言环境。尝试 运行 export LANG=en_US.utf8
(一个非常常见的语言环境),看看是否可以解决问题,或者只是与本地 [=72= 中的 echo $LANG
returns 相同的字符串](或Mac)。注意:locale -a
将列出所有已安装的语言环境(当然,您必须 install/activate 其他语言环境)。
注意:原因是您使用的是 root,您需要做出艰难的决定:将默认 root 语言环境设置为 en_US.utf8
或 C.utf8
(在非交互式 shell保持 C
或 en US
作为语言,否则许多脚本将失败)。
我个人的看法:root 程序应该只写 ASCII 字符。 UTF-8 数据有文件和日志。要在控制台中写入,只需使用回退 replace
或 backslashreplace
(出于安全原因,我永远不会在 root 中使用 ignore
)。
无论如何,您的代码也不理想,您发现编写 encoding='utf8'
可以解决问题。 Python 咒语包括:explicit is better than implicit,所以如果你知道 name_dir
的编码,就使用它,而不是让 Python (而不是 PyCharm) 来找出本地编码(在您的情况下,它似乎是 ASCII)。 Python 使用 locale.getpreferredencoding 查找默认语言环境。
所以,它不是 PyCharm,但问题出在您的远程语言环境中(Python 默认使用它)。我会通过在 open
(和 write
)上明确编码来解决这个问题。但是,如果您没有 运行 将程序设置为 root,我还会检查为什么您的远程用户默认情况下不使用 UTF-8 语言环境。
我有下面这段代码报错:
def get_name(self, name_dir):
name = {}
for cnt, line in enumerate(open(name_dir, 'r')):
id, gname = line.strip().split('\t')
name[id] = gname
return name
错误信息:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 27: ordinal not in range(128)
我在 Mac 和 Ubuntu 机器上 运行 在 python3 本地,没有错误。但是,当我在 PyCharm 中设置远程解释器以在 ubuntu 机器上使用相同的 python3 解释器时,它会报告错误。
我通过将 encoding='utf8' 添加到文件 'open' 函数来解决问题。这是否意味着 PyCharm 在配置远程解释器时引入了错误?
不,PyCharm 做它应该做的事情。
问题是 你在 Mac 和 Ubuntu 上都在本地尝试过,这很好,但这隐藏了你的本地计算机有 locales,可能支持UTF-8,但远程计算机不支持。
现在,默认情况下,大多数 Linux 发行版都会使用 UTF-8 语言环境安装用户,所以我假设两者之一(从我的角度来看,第二种更有可能):
您安装 Ubuntu 时使用的图像非常小,没有很多(或任何)语言环境。或者您要使用的语言环境未安装,Ubuntu 只找到默认语言环境作为回退(
C
语言环境)。或者您正在使用 root。 Root 通常(并且为了可移植性)仅使用
C
语言环境,它仅支持 ASCII 字符集。
因此,我假设在您的远程计算机中您没有使用 UTF-8 语言环境。尝试 运行 export LANG=en_US.utf8
(一个非常常见的语言环境),看看是否可以解决问题,或者只是与本地 [=72= 中的 echo $LANG
returns 相同的字符串](或Mac)。注意:locale -a
将列出所有已安装的语言环境(当然,您必须 install/activate 其他语言环境)。
注意:原因是您使用的是 root,您需要做出艰难的决定:将默认 root 语言环境设置为 en_US.utf8
或 C.utf8
(在非交互式 shell保持 C
或 en US
作为语言,否则许多脚本将失败)。
我个人的看法:root 程序应该只写 ASCII 字符。 UTF-8 数据有文件和日志。要在控制台中写入,只需使用回退 replace
或 backslashreplace
(出于安全原因,我永远不会在 root 中使用 ignore
)。
无论如何,您的代码也不理想,您发现编写 encoding='utf8'
可以解决问题。 Python 咒语包括:explicit is better than implicit,所以如果你知道 name_dir
的编码,就使用它,而不是让 Python (而不是 PyCharm) 来找出本地编码(在您的情况下,它似乎是 ASCII)。 Python 使用 locale.getpreferredencoding 查找默认语言环境。
所以,它不是 PyCharm,但问题出在您的远程语言环境中(Python 默认使用它)。我会通过在 open
(和 write
)上明确编码来解决这个问题。但是,如果您没有 运行 将程序设置为 root,我还会检查为什么您的远程用户默认情况下不使用 UTF-8 语言环境。