我尝试使用命令 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.
看起来这是一个known pip
中的 versions > 10
存在问题,我理解该部分(我目前有 pip 18
)。但我刚刚发现我可以通过直接执行 pip install psutil
来解决它,而不使用 Upgrade
标志。我想知道这背后是否有原因。我最初的感觉是,在第一种情况下,当 pip
尝试升级时,它首先尝试删除软件包,但它不能,但在后一种情况下,它尝试直接安装,因此不会得到错误。我的问题是,是否仍然不必先删除软件包并安装(不使用升级标志时),或者为什么 pip 会给出带有升级标志的错误,但没有它时不会出现错误。
编辑:所以,我尝试按照 hoefling
的建议运行 pip install -v psutil
,并且我得到了一大堆文本,而不是说需求已经存在met,这意味着 psutil 一开始就没有安装。我试着想了一下,这是我到目前为止所理解的:我在 python virtualenv
中运行并通过 pip -U -rrequirements.txt
安装它code> 其中 requirements.txt
包含一堆包,其中包括 psutil
。当我删除 -U
标志时,它会跳过安装 psutil
,并跳转到其他包。这就提出了另一个问题,当没有 -U
标志时,这是否是 pip
应该表现的方式。有趣的是,第一次使用 -U 标志安装软件包时,它会查看主 python 安装而不是虚拟环境安装,而当删除 -U 标志时,它不会执行此操作并完全跳过。
最佳答案
在某些设置中,您将一堆软件包安装在不是 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/等包的 Python 包做类似的事情,或者至少曾经做类似的事情,这些包进入 distutils
目录,这与您通过 pip
安装的东西不同手动,进入 setuptools
目录。细节有 pip 不同,但效果和解决方法最终是相同的。)
如果您安装pip
,然后尝试pip install -U numpy
或pip uninstall numpy
, pip
将看到distribute
-风格numpy-1.8.0rc1-py2.7.egg-info
归档并拒绝触摸它,以免破坏所有东西。
如果你只是pip install numpy
,但是,它只会在 setuptools
使用的标准站 pip 包安装位置中查找。 , /Library/Python/2.7/site-packages
,看不到任何内容,然后愉快地为您安装现代版本的 NumPy。
而且,因为/Library/Python/2.7/site-packages
出现在 /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
之前在您的sys,path
上,新的 NumPy 将隐藏旧的 NumPy,一切都会按预期运行。
这可能会出现一些问题。最值得注意的是,如果您尝试安装 Extras 本身未包含的内容,但其依赖项包含在 Extras 中,则可能会失败,并出现神秘且难以调试的错误。例如,在 macOS 10.12 上,pip install pandas
会向您抛出一堆关于无法升级的错误 dateutil
,你甚至不知道你正在尝试这样做。您唯一能做的就是查看 pandas
的依赖关系,查看 Extras
中预装了哪些,并手动pip install
所有这些的影子版本。
但是,在大多数情况下,它是有效的。
关于python - pip:卸载已安装的 disutils 软件包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51715599/