首页 > 解决方案 > pip 无法卸载:“这是一个distutils安装的项目”

问题描述

我尝试安装 Twilio 模块:

sudo -H pip install twilio

我得到了这个错误:

Installing collected packages: pyOpenSSL
  Found existing installation: pyOpenSSL 0.13.1
Cannot uninstall 'pyOpenSSL'. 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.

有人知道如何卸载 pyOpenSSL 吗?

标签: pythoninstallationpipdistutils

解决方案


此错误意味着此包的元数据不包含属于它的文件列表。很可能,您已经通过操作系统的包管理器安装了这个包,因此您需要使用它而不是pip更新或删除它。

参见例如升级到 pip 10:这是一个 distutils 安装的项目,因此我们无法准确确定哪些文件属于它,这只会导致部分卸载。· 问题 #5247 · pypa/pip是一个这样的例子,其中安装了apt.


或者,根据您的需要,不使用您的系统 Python 和/或其全局环境,而是创建一个私有 Python 安装和/或环境可能会更有效率。这里有很多选项,包括、 、virtualenvvenv将Python 从源代码安装到 或/ (或)。pyenvpipenv/usr/local$HOME$HOME/.local/opt/<whatever>


最后,我必须评论经常被建议的(例如在pip 10 和 apt:如何避免 distutils 包的“无法卸载 X”错误--ignore-installed pip开关。

可能会起作用(可能会持续足够长的时间来满足您的业务需求),但也可能会以不可预知的方式破坏系统上的东西。有一件事是肯定的:它使系统的配置不​​受支持,因此无法维护——因为你基本上已经用其他一些任意的东西覆盖了你的发行版中的文件。例如:

  • 如果新文件与旧文件的二进制文件不兼容,则发行版中为链接原始文件而构建的其他软件将出现段错误或其他故障。
  • 如果新版本有一组不同的文件,您最终会得到新旧文件的混合,这可能会破坏依赖软件以及包本身。
  • 如果您稍后使用操作系统的包管理器更改包,它将覆盖已pip安装的文件,并产生类似的不可预测的结果。
  • 如果有配置文件之类的东西,版本之间的差异也会导致各种损坏。

推荐阅读