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

rac*_*uel 19 python distutils pip

我试着安装Twilio模块:

sudo -H pip install twilio
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

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.
Run Code Online (Sandbox Code Playgroud)

有谁知道如何卸载pyOpenSSL?

小智 34

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

  pip install --ignore-installed pyOpenSSL
Run Code Online (Sandbox Code Playgroud)

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

  pip install twilio
Run Code Online (Sandbox Code Playgroud)

它会起作用。

  • 当我尝试安装“google-api-python-client”时,我遇到了与“httplib2”相同的错误,这个解决方案也对我有用(linux/ubuntu),谢谢! (2认同)

iva*_*eev 24

此错误表示此程序包的元数据不包含属于它的文件列表.最有可能的是,您已经通过操作系统的软件包管理器安装了此软件包,因此您需要使用它而不是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:如何避免"无法卸载X"的distutils包错误)--ignore-installed pip切换.

可能有效(可能需要足够长的时间来满足您的业务需求),但也可能以不可预测的方式破坏系统上的内容.有一件事是肯定的:它使系统的配置不​​受支持,因而无法维护 - 因为你基本上用你的其他任意东西覆盖了你的发行版中的文件.例如:

  • 如果新文件是二进制文件与旧文件不兼容,则构建为与原始文件链接的分发版中的其他软件将发生段错误或以其他方式发生故障.
  • 如果新版本具有不同的文件集,您最终会混合使用旧文件和新文件,这可能会破坏相关软件以及软件包本身.
  • 如果您稍后使用操作系统的软件包管理器更改软件包,它将覆盖已pip安装的文件,但结果类似的不可预测.
  • 如果有配置文件之类的东西,版本之间的差异也会导致各种破坏.

  • @sk 在没有 `--ignore-installed` 的情况下运行不会以此处描述的方式破坏内容。如果您使用 Pip 安装 Python 包,然后_使用 Apt 安装相同的包_并且_依赖于它的东西,则可能会发生版本冲突。这两个版本不会互相破坏,但依赖包可能不支持 Pip 的较新依赖项。 (2认同)

ewa*_*lel 9

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

pip install --ignore-installed [package name]==[package version]
Run Code Online (Sandbox Code Playgroud)

  • 请问您能否对您建议的解决方案进行合理化解释?有什么缺点吗? (3认同)

Tri*_*ima 5

就我而言,我使用以下命令从内部 git 安装一个包:

python -m pip install package.whl --force
Run Code Online (Sandbox Code Playgroud)

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

我想补充一下,我--ignore-installed也曾为我工作过。在我的例子中,删除--force本质上是做同样的事情。