我正在尝试使用命令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
与versions > 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标志被删除时,它不会这样做,而是完全跳过。
答案 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
,然后尝试进行pip
或pip install -U numpy
,则pip uninstall numpy
将看到pip
样式的distribute
文件,并且因为害怕破坏一切而拒绝触摸它。
但是,如果您只是numpy-1.8.0rc1-py2.7.egg-info
,它将仅在pip install numpy
,setuptools
使用的标准站点软件包安装位置中查找,那里什么也看不到,并愉快地安装现代版本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
对其所有版本进行了阴影处理。
但是,在大多数情况下,它是可行的。