pip 无法卸载 <package>:“这是一个 distutils 安装的项目”
Posted
技术标签:
【中文标题】pip 无法卸载 <package>:“这是一个 distutils 安装的项目”【英文标题】:pip cannot uninstall <package>: "It is a distutils installed project" 【发布时间】:2019-05-17 08:45:14 【问题描述】:我尝试安装 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 吗?
【问题讨论】:
【参考方案1】:这个错误意味着这个包的元数据不包含属于它的文件列表。 很可能,您已经通过操作系统的包管理器安装了此包,因此您也需要使用它而不是 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 安装和/或环境可能会更有效率。这里有很多选项,包括virtualenv
、venv
、pyenv
、pipenv
以及从源代码安装 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
安装的文件,同样会产生不可预知的结果。
如果有配置文件之类的东西,版本之间的差异也会导致各种损坏。
【讨论】:
谢谢。我采纳了您的建议并创建了一个私有 Python 安装。 使用sudo -H pip3 install <package>
安装的软件包怎么样?我通常使用它而不是构建虚拟环境。这样我个人需要的软件包就安装在/usr/local
中。因此,它们不应干扰在/usr
中安装了apt
的那些。但即使使用前一个命令,pip
也会抱怨 OP 提到的错误。 @ivan_pozdeev:如果你有这样的信息,你能完成你已经很好的答案吗?
@s.k 在没有--ignore-installed
的情况下运行不会以此处描述的方式破坏内容。如果您使用 Pip 安装 Python 包,并且 然后 使用 Apt 安装相同的包 和 依赖于它的东西,则可能会发生版本冲突。这两个版本不会相互破坏,但依赖包可能不支持来自 Pip 的新依赖。
我之前是使用yum
安装的。我已经通过yum remove python-requests
卸载,然后通过发出`pip install requests' 使用pip
安装【参考方案2】:
我遇到了同样的错误,并且能够使用以下步骤解决:
pip install --ignore-installed pyOpenSSL
这将安装最新版本的软件包,然后如果您尝试安装,
pip install twilio
它会起作用的。
【讨论】:
我在尝试安装 'google-api-python-client' 时遇到了与 'httplib2' 相同的错误,这个解决方案也适用于我(linux/ubuntu),谢谢!【参考方案3】:一般来说,对于类似的错误,使用这种格式:
pip install --ignore-installed [package name]==[package version]
【讨论】:
【参考方案4】:我刚刚遇到这个错误,我能够解决它的唯一方法是从 site-packages
手动删除有问题的目录。
完成此操作后,您可能需要使用--force-reinstall
重新安装软件包。
【讨论】:
【参考方案5】:阅读上述 cmets,我了解到包 a 是使用 conda 安装的,而我尝试使用 pip 安装的新包 b 会导致问题。我很幸运包 b 有 conda 支持,所以使用 conda 安装包 b 解决了这个问题。
【讨论】:
【参考方案6】:就我而言,我使用以下命令从内部 git 安装包:
python -m pip install package.whl --force
我这样做是因为我不想明确卸载以前的版本而只是用更新的版本替换它。但它也做的是再次安装所有依赖项。我在其中一个包中遇到了错误。删除 --force
解决了这个问题。
我想补充一下,--ignore-installed
也对我有用。在我的情况下,删除 --force
基本上是在做同样的事情。
【讨论】:
以上是关于pip 无法卸载 <package>:“这是一个 distutils 安装的项目”的主要内容,如果未能解决你的问题,请参考以下文章
Jupiter 页面环境下使用pip无法安装(AttributeError: module 'pip' has no attribute 'main')