pip:卸载已安装的Disutils软件包

时间:2018-08-06 21:03:32

标签: python pip psutil

我正在尝试使用命令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.

这似乎是pipversions > 10的{​​{3}}问题,我了解这一部分(我目前有pip 18)。但是我发现我可以直接执行pip install psutil而不使用Upgrade标志来解决它。我想知道背后是否有理由。我的最初感觉是,在第一种情况下,pip尝试升级,它首先尝试删除该软件包,但是无法删除,但是在后一种情况下,它试图直接安装,因此没有得到错误。我的问题是它是否仍然不必先删除软件包并进行安装(当不使用Upgrade标志时),或者为什么pip会给出带有Upgrade标志的错误,但没有它就没有错误。

编辑:因此,我尝试按照pip install -v psutil的建议运行hoefling,并且得到了一堆文字,而不是说已经满足要求,这意味着psutil没有得到满足首先安装。我试图弄清楚这一点,到目前为止,这是我所了解的:我在python virtualenv中运行,并通过pip -U -r requirements.txt进行安装,其中requirements.txt包含一堆软件包包括psutil。当我删除-U标志时,它会跳过安装psutil并跳至其他软件包。这就提出了另一个问题,即在没有pip标志的情况下,-U应该如何表现?有趣的是,第一次使用-U标志安装软件包时,它会在主要的python安装中查找,而不是在虚拟环境中查找,并且-U标志被删除时,它不会这样做,而是完全跳过。

1 个答案:

答案 0 :(得分:1)

在某些设置中,您有一堆软件包安装在setuptools的非常规安装位置,并且位于sys.path的常规安装位置之后。

这些设置中最常见的可能是Apple预先安装的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型鸡蛋的形式安装。

(某些Linux发行版使用RPM / DEB / etc。软件包构建的Python软件包执行了(或至少曾经做过类似的事情),这些软件包进入distutils目录,这与通过{{ 1}}或手动添加到pip目录中。细节有所不同,但是效果和解决方法最终还是相同的。)

如果您安装setuptools,然后尝试进行pippip install -U numpy,则pip uninstall numpy将看到pip样式的distribute文件,并且因为害怕破坏一切而拒绝触摸它。

但是,如果您只是numpy-1.8.0rc1-py2.7.egg-info,它将仅在pip install numpysetuptools使用的标准站点软件包安装位置中查找,那里什么也看不到,并愉快地安装现代版本NumPy为您服务。

而且,由于/Library/Python/2.7/site-packages在您的/Library/Python/2.7/site-packages上的/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python之前,因此新的NumPy将隐藏古老的NumPy,并且一切都会按预期进行。

这可能会有一些问题。最值得注意的是,如果您尝试安装Extras本身未包含但依赖项 包含在Extras中的某些内容,则它可能会因神秘而难以调试的错误而失败。例如,在macOS 10.12上,sys,path将因无法升级pip install pandas而向您抛出很多错误,而您甚至都不知道自己试图这样做。您唯一可以做的就是查看dateutil的依赖项,查看哪些pandas中已预安装了哪些依赖项,并手动Extras对其所有版本进行了阴影处理。

但是,在大多数情况下,它是可行的。