pip UnicodeDecodeError:'utf8'编解码器无法解码字节

D.W*_*.W. 2 python pip

我跑pip,我总是得到以下错误,无论我传递给哪些标志pip:

$ pip --version
Traceback (most recent call last):
    [...irrelevant details omitted...]
      File "/usr/lib64/python2.7/codecs.py", line 314, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xf6 in position 203: invalid start byte
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?我该如何解决?

我安装了pip版本8.0.2.更改或清除LANGLC_ALL环境变量没有帮助.我必须在这里阅读其他十几个问题,但我很难找到能够清楚地表明问题是什么或如何解决的问题.

D.W*_*.W. 8

这是怎么回事

pip马车.如果任何已安装的Python系统库在库描述中具有非ASCII字符,则可能会崩溃.

错误消息的相关部分是这样的:

UnicodeDecodeError: 'utf8' codec can't decode byte ...
Run Code Online (Sandbox Code Playgroud)

特定的字节值并不重要.崩溃是由.egg-info存储Python包的系统目录中的某个文件中的某种非ASCII字符触发的(例如/usr/lib/python2.7/site-packages). pip尝试解析所有这些文件,当遇到某些非ASCII字符时,它会崩溃并死掉.

如何解决问题

有两种选择:

  1. 正确的修复:更新pip到最新版本.这解决了这个问题.

  2. kludge:删除触发pip崩溃的有问题的Python库包.这需要你弄清楚哪个Python库包负责; 不幸的是,pip并没有给你很多帮助来解决这个问题,所以你将不得不做一些调查来弄明白 - 见下一节.

显然,前一个选项更可取......但如果由于某种原因你无法升级pip,我将描述如何遵循第二种方法.

如何找到负责此的Python库

以下是如何检查Python系统包并缩小哪个可能pip导致崩溃的原因.我们将*.egg-info在Python site-packages/目录中查找具有非ASCII字符的任何文件.试试这个:

cd /usr/lib/python2.7/site-packages
LANG=ascii grep -P  '[[:^ascii:]]' *.egg-info 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

(这需要GNU grep.)查看它找到的匹配项.检查每个文件以查看它是否包含与错误消息匹配的非ASCII字符.

在我的情况下,提到的错误消息can't decode byte 0xf6,所以我们将寻找包含一个0xf6字节的文件.我们可以使用hex dump实用程序检查每个匹配的文件; 我喜欢用hexdump -C.

要找到匹配的,则可能需要检查Python包,如其他地点/usr/lib64/python2.7/site-packages,/usr/local/lib/python2.7/site-packages等.

一旦找到导致问题的Python包,就可以尝试删除该库(如果它不是必需的包).

其他可能的解释和故障排除步骤

在较旧的系统上,如果当前路径或用户名包含任何非ASCII字符,也可能会触发此错误.

有些人报告说他们通过清除LC_ALLLANG环境变量或通过将它们设置为不同的设置(如export LC_ALL="en_US.UTF-8" LANG="en_US.UTF-8".但这对我没有帮助.

其他阅读

我发现有用的参考资料: