pip:卸载一个使用disutils安装的包

3

我正在尝试使用命令pip install -U psutil安装psutil,但出现错误:

Cannot uninstall 'psutil'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

看起来这是一个已知问题,与pip版本 > 10有关,我理解这一点(我目前有pip 18)。但我刚刚发现可以通过直接执行pip install psutil而不使用Upgrade标志来解决它。我想知道背后的原因。我最初的感觉是,在第一种情况下,即pip尝试升级时,它首先尝试删除软件包,但它无法删除,但在后一种情况下,它直接尝试安装,因此没有出现错误。我的问题是,当不使用Upgrade标志时,它是否仍然不需要先删除软件包再安装,或者为什么特别是在使用Upgrade标志时pip会报错,而不使用标志时不会出错。
编辑:因此,我尝试像hoefling建议的那样运行pip install -v psutil,但是我得到了一大堆文本,而不是说已经满足要求,这意味着psutil首先没有被安装。 我试图弄清楚这个问题,到目前为止,我所理解的是:我在python 虚拟环境内运行,并通过pip -U -r requirements.txt来安装它,其中requirements.txt包含一堆软件包,包括psutil。 当我删除-U标志时,它会跳过安装psutil并转到其他软件包。这引起了另一个问题,当没有-U标志时,是否应该这样使用pip。有趣的是,第一次使用-U标志安装软件包时,它会查找主python安装而不是虚拟环境,当删除-U标志时,它不会这样做并完全跳过它。

首先,您是否使用苹果预装的Python 2.7在Mac上,并且已经安装了作为苹果奇怪“Extras”功能的一部分的psutil,还是您实际上已经easy_install psutil或类似的方式安装了它? - abarnert
你最初安装时使用了一个非常旧的 pip 版本,比如 1.5.x 吗?setuptools 已经破坏了向后兼容性几次,但我不认为你会在 Ubuntu 18.04 中看到这种情况... - abarnert
@abarnert 不,我从未有意安装过它,我的猜测是它是随 Ubuntu 18.04 预装的。 - QPTR
@hoefling 它肯定已安装。 - QPTR
2
您应该检查sys.path上是否存在两个不同位置的psutil副本。 只要新版本是在较早的sys.path位置中的版本,一切都应该正常工作(原因与我的答案中的某些变化相关,尽管我不知道Ubuntu 18.04的特定细节)。 如果旧版本不再存在,则可能发生了不同的情况。 - abarnert
显示剩余6条评论
1个回答

1
在一些设置中,您可能安装了一堆软件包,它们不在setuptools的正常安装位置上,并且出现在sys.path的正常安装位置之后。

其中最常见的设置可能是苹果预安装的Python 2.7,因此我将以其为例。即使这不是您的设置,它仍然有助于说明问题。

Apple包括一个Extras目录(位于/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python),其中包含一堆第三方软件包,这些软件包是Apple自己的工具所需的,或者是Apple认为您可能需要的(当Apple关心提供任何平台上最好的Python体验时)。

例如,在macOS 10.13上,该目录将包括NumPy 1.8.0。

所有这些软件包都安装为distribute风格的egg文件。

一些 Linux 发行版会以 RPM/DEB 等包的形式构建 Python 包,并将其放入 distutils 目录,与通过 pip 或手动安装的东西不同,后者会放入 setuptools 目录。细节有所不同,但效果和解决方法都是相同的。
如果你安装了 pip 并尝试 pip install -U numpy 或 pip uninstall numpy,则 pip 将看到 distribute 风格的 numpy-1.8.0rc1-py2.7.egg-info 文件,并担心破坏一切而拒绝触及它。
然而,如果你只安装 pip install numpy,则它只会在 setuptools 使用的标准 site-packages 安装位置 /Library/Python/2.7/site-packages 中查找,如果什么都没有,就会愉快地为你安装一个现代版本的 NumPy。

由于在您的sys,path中,/Library/Python/2.7/site-packages出现在/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python之前,因此新的NumPy将隐藏古老的NumPy,一切都会按预期工作。

这可能会有一些问题。最值得注意的是,如果您尝试安装不包含在Extras中但具有依赖项的内容,则可能会失败并出现难以调试的错误。例如,在macOS 10.12上,pip install pandas会向您抛出一堆关于无法升级dateutil的错误,而您甚至不知道自己正在尝试升级它。您唯一能做的就是查看pandas的依赖项,查看哪些预安装在Extras中,并手动pip install覆盖所有这些版本。

但总体而言,它还是有效的。


@abarnet 非常感谢您的回答,非常有启发性。鉴于 @hoelfling 刚刚提出的建议,我觉得 -U 标志还有其他事情发生,您认为您能看到我所做的上述 EDIT 吗? - QPTR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接