pip 无法卸载 <package>:"It is a distutils installed project"

pip cannot uninstall <package>: "It is a distutils installed project"

我尝试安装 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 吗?

这个错误意味着这个包的元数据不包括属于它的文件列表。 很可能,您已经通过 OS' 包管理器安装了这个包,所以您也需要使用它而不是 pip 来更新或删除它。

参见例如Upgrading to pip 10: 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. · Issue #5247 · pypa/pip 一个这样的例子,其中包安装了 apt.


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


最后,我必须评论经常建议的(例如在 --ignore-installed pip 开关。

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

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

我遇到了同样的错误,并且能够通过以下步骤解决:

  pip install --ignore-installed pyOpenSSL

这将安装最新版本的包,如果您尝试安装,

  pip install twilio

它会起作用。

我刚遇到这个错误,唯一能够解决它的方法是从 site-packages.

中手动删除有问题的目录

执行此操作后,您可能需要使用 --force-reinstall 重新安装软件包。

一般来说,对于类似的错误,使用这种格式:

pip install --ignore-installed [package name]==[package version]

阅读以上评论,我了解到包 a 是使用 conda 安装的,而我尝试使用 pip 安装的新包 b 导致了问题。我很幸运,包 b 有 conda 支持,所以使用 conda 安装包 b 解决了这个问题。

在我的例子中,我使用以下命令从内部 git 安装了一个包:

python -m pip install package.whl --force

我这样做是因为我不想明确卸载以前的版本,而只是用更新的版本替换它。但它也做的是再次安装所有依赖项。我在其中一个包中收到错误。删除 --force 解决了问题。

我想补充一点,--ignore-installed 也对我有用。在我的案例中,删除 --force 本质上是在做同样的事情。