我尝试安装 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 吗?
此错误意味着此包的元数据不包含属于它的文件列表。 最有可能的是,您已经通过操作系统的软件包管理器安装了此软件包,因此您也需要使用它而不是
pip
来更新或删除它。
参见例如升级到pip 10:这是一个distutils安装的项目,因此我们无法准确确定哪些文件属于它,这将导致仅部分卸载。 · 问题 #5247 · pypa/pip 是一个这样的例子,其中包是通过
apt
安装的。
或者,根据您的需求,不使用系统 Python 和/或其全局环境,而是创建私有 Python 安装和/或环境可能会更高效。这里有很多选项,包括
virtualenv
、venv
、pyenv
、pipenv
以及从源代码安装 Python
/usr/local
或 $HOME
/$HOME/.local
(或 /opt/<whatever>
)。
最后,我必须评论经常建议的(例如在 pip 10 和 apt:如何避免 distutils 软件包的“无法卸载 X”错误)
--ignore-installed
pip
开关。
它可能可以工作(可能会持续足够长的时间来满足您的业务需求),但也可能以不可预测的方式破坏系统上的东西。有一点是肯定的:它使系统的配置不受支持,从而无法维护——因为您基本上已经用其他一些任意的东西覆盖了您的发行版中的文件。例如:
pip
安装的文件,同样会产生不可预测的结果。我遇到了同样的错误,并能够使用以下步骤解决:
pip install --ignore-installed pyOpenSSL
这将安装最新版本的软件包,然后如果您尝试安装,
pip install twilio
它会起作用的。
一般来说,对于类似的错误,使用这种格式:
pip install --ignore-installed [package name]==[package version]
就我而言,我使用以下命令从内部 git 安装一个包:
python -m pip install package.whl --force
我这样做是因为我不想明确卸载以前的版本并用更新的版本替换它。但它还做的是再次安装所有依赖项。我在其中一个包中收到错误。删除
--force
解决了问题。
我想补充一点,
--ignore-installed
也对我有用。在我的例子中,删除 --force
本质上是做同样的事情。
我刚刚遇到此错误,解决该问题的唯一方法是从
site-packages
中手动删除有问题的目录。
执行此操作后,您可能需要使用
--force-reinstall
重新安装软件包。
阅读上面的评论,我了解到软件包 a 是使用 conda 安装的,而我尝试使用 pip 安装的新软件包 b 导致了问题。我很幸运,包 b 有 conda 支持,所以使用 conda 安装包 b 解决了问题。
就我而言,只需删除
site-packages
中已安装的软件包,然后重新安装该软件包即可。要查找site-packages
的路径,可以尝试pip install package name
,将打印特定路径的路径。