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

vhipe2zx  于 2024-01-05  发布在  Python
关注(0)|答案(2)|浏览(150)

我运行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环境变量没有帮助。我必须在这里阅读十几个其他问题,但我很难找到任何提供明确指示的问题是什么或如何修复它。

icomxhvb

icomxhvb1#

发生了什么事
pip有缺陷。如果任何已安装的Python系统库在库描述中包含非ASCII字符,则可能会崩溃。
错误消息的相关部分如下:

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

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

如何解决问题

有两种选项:
1.**正确的修复程序:**将pip更新到最新版本。这将修复该错误。
1.**问题:**删除导致pip崩溃的Python库包。这需要你找出是哪个Python库包造成的;不幸的是,pip并没有给予你太多的帮助来找出原因,所以你必须做一些调查来找出原因--见下一节。
显然,前一种方法更可取......但是,如果由于某种原因无法升级pip,我将介绍如何遵循第二种方法。

如何找到负责此操作的Python库

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

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


(This需要GNU grep。)仔细查看找到的匹配项。检查每个文件是否包含与错误信息匹配的非ASCII字符。
在我的例子中,错误信息提到了can't decode byte 0xf6,所以我们要查找包含0xf6字节的文件。我们可以使用十六进制转储实用程序检查每个匹配的文件;我喜欢使用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"),获得了成功。

其他阅读

我认为有帮助的参考资料:

nimxete2

nimxete22#

可能还有另一个原因,这有点令人惊讶。
您遇到的错误消息表明pip在尝试解析distro.Linux_distribution()函数的输出时遇到问题。此函数用于确定操作系统的发行版和版本。该错误特别提到无法解码字节0x 99,该字节被视为UTF-8编码的无效起始字节。
这可能是由于/etc/os-release文件中的损坏导致的,该文件包含操作系统分发信息。
下载原始的/etc/os-release文件:您可以在线找到特定Linux发行版的原始/etc/os-release文件。下载适合您的操作系统的文件,并用它替换现有的文件。

相关问题