我运行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
环境变量没有帮助。我必须在这里阅读其他十几个问题,但我很难找到能够清楚地表明问题是什么或如何解决的问题。
答案 0 :(得分:6)
pip
是错误的。如果任何已安装的Python系统库在库描述中具有非ASCII字符,则可能会崩溃。
错误消息的相关部分是:
UnicodeDecodeError: 'utf8' codec can't decode byte ...
特定的字节值并不重要。崩溃由存储Python包的系统目录中的.egg-info
文件中的某种非ASCII字符触发(例如,/usr/lib/python2.7/site-packages
)。 pip
尝试解析所有这些文件,当遇到某些非ASCII字符时,它会崩溃并死掉。
有两种选择:
正确的解决方法:将pip
更新到最新版本。这解决了这个问题。
kludge:删除导致pip
崩溃的有问题的Python库包。这需要你弄清楚哪个Python库包负责;不幸的是,pip
并没有给你很多帮助来解决这个问题,所以你将不得不做一些调查来弄明白 - 见下一部分。
显然,前一个选项更可取......但如果由于某种原因你无法升级pip
,我将描述如何遵循第二种方法。
以下是检查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_ALL
和LANG
环境变量或将其设置为不同的设置(例如export LC_ALL="en_US.UTF-8" LANG="en_US.UTF-8"
)来报告他们取得了成功。但这对我没有帮助。
我发现有用的参考资料: