pip无法卸载<package>:“这是一个distutils安装的项目”

时间:2018-12-16 23:51:50

标签: python 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吗?

6 个答案:

答案 0 :(得分:17)

我遇到了相同的错误,并可以通过以下步骤解决:

  pip install --ignore-installed pyOpenSSL

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

  pip install twilio

它将起作用。

答案 1 :(得分:11)

此错误表示此程序包的元数据不包括属于它的文件列表。 很可能您是通过操作系统的软件包管理器安装了此软件包,因此也需要使用它而不是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和/或其全局环境,而是创建私有Python安装和/或环境,可能会更有效率。这里有很多选项,包括virtualenvvenvpyenvpipenv以及将Python从源代码安装到 /usr/local$HOME / $HOME/.local(或/opt/<whatever>)。


最后,我必须对经常提出的建议(例如,在pip 10 and apt: how to avoid "Cannot uninstall X" errors for distutils packages--ignore-installed pip上进行评论。

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

  • 如果新文件是与旧文件不兼容的二进制文件,则发行版中与原始文件建立链接的其他软件将出现段错误或其他故障。
  • 如果新版本包含一组不同的文件,则最终会混合使用旧文件和新文件,这可能会破坏相关软件以及程序包本身。
  • 如果以后使用操作系统的软件包管理器更改软件包,它将覆盖pip安装的文件,结果也具有不可预测的作用。
  • 如果存在诸如配置文件之类的内容,则版本之间的差异也可能导致各种损坏。

答案 2 :(得分:1)

通常,对于类似错误,请使用以下格式:

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

我只是遇到此错误,而解决此错误的唯一方法是从site-packages手动删除有问题的目录。

这样做之后,您可能需要使用--force-reinstall重新安装软件包。

答案 5 :(得分:-1)

在许多情况下,一个简单的解决方法是告诉pip忽略此软件包:

pip install twilio --ignore-installed pyOpenSSL