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

时间:2017-01-28 04:05:23

标签: 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

发生了什么事?我该如何解决这个问题?

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

1 个答案:

答案 0 :(得分:6)

发生了什么

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

错误消息的相关部分是:

UnicodeDecodeError: 'utf8' codec can't decode byte ...

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

如何解决问题

有两种选择:

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

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

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

    如何找到负责此

    的Python库

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

    cd /usr/lib/python2.7/site-packages
    LANG=ascii grep -P  '[[:^ascii:]]' *.egg-info 2>/dev/null
    

    (这需要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")来报告他们取得了成功。但这对我没有帮助。

    其他阅读

    我发现有用的参考资料: