我运行 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。更改或清除 LANG
和 LC_ALL
环境变量没有帮助。我一定在这里阅读了十几个其他问题,但我正在努力寻找任何可以清楚地说明问题是什么或如何解决问题的内容。
最佳答案
发生了什么
pip
有问题。如果任何已安装的 Python 系统库在库描述中包含非 ASCII 字符,它可能会崩溃。
错误消息的相关部分是这样的:
UnicodeDecodeError: 'utf8' codec can't decode byte ...
具体的字节值并不重要。崩溃是由存储 Python 包的系统目录(例如 /usr/lib/python2.7)中的
)。 .egg-info
文件中的某种非 ASCII 字符触发的/网站包pip
尝试解析所有这些文件,当它遇到某些非 ASCII 字符时,它会失败并死掉。
如何解决问题
有两种选择:
正确的解决方法:将
pip
更新到最新版本。这修复了错误。错误:删除触发
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
(这需要 GNU grep。)查看它找到的匹配项。检查每个文件以查看它是否包含与错误消息匹配的非 ASCII 字符。
在我的例子中,提到的错误消息无法解码字节 0xf6
,所以我们要查找包含 0xf6
字节的文件。我们可以使用十六进制转储实用程序检查每个匹配的文件;我喜欢使用 hexdump -C
。
要找到匹配项,您可能需要检查 Python 包的其他位置,例如 /usr/lib64/python2.7/site-packages
、/usr/local/lib/python2.7/site-packages
等。
一旦找到导致问题的 Python 包,您可以尝试删除该库(如果它不是必需的包)。
其他可能的解释和故障排除步骤
在旧系统上,如果您的当前路径或用户名包含任何非 ASCII 字符,也可能会触发此错误。
有些人报告说,他们通过清除 LC_ALL
和 LANG
环境变量,或者将它们设置为不同的设置,例如 export LC_ALL="en_US.UTF-8"LANG="en_US.UTF-8"
。不过,这对我没有帮助。
其他阅读
我发现有帮助的引用资料:
关于python - pip UnicodeDecodeError : 'utf8' codec can't decode byte,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41906206/