首页 文章

pip UnicodeDecodeError:'utf8' codec无法解码字节

提问于
浏览
1

我运行 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 回答

  • 6

    发生了什么事

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

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

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

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

    如何解决问题

    有两种选择:

    • The right fix: 更新 pip 到最新版本 . 这解决了这个问题 .

    • The kludge: 删除触发 pip 崩溃的有问题的Python库包 . 这需要你弄清楚哪个Python库包负责;不幸的是, pip 并不需要做一些调查才能弄明白 - 请参阅下一节 .

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

    如何找到负责此的Python库

    以下是如何检查Python系统包并缩小哪一个可能负责查找具有非ASCII字符的Python site-packages/ 目录中的任何 *.egg-info 文件. pip 's crashes. We'试试这个:

    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" )获得了成功 . 但这对我没有帮助 .

    其他阅读

    我发现有用的参考资料:

相关问题