【问题标题】:Does uninstalling a package with "pip" also remove the dependent packages?使用“pip”卸载包是否也会删除依赖包?
【发布时间】:2011-12-16 11:46:38
【问题描述】:

当您使用pip 安装软件包时,所有必需的软件包也将随它一起安装(依赖项)。卸载该包是否也会删除依赖包?

【问题讨论】:

  • 为什么不试试看呢?我会这样做来回答你的问题,但由于某种原因,pip 现在无法在此处获取包索引。
  • 我在pip newsgroup 中发现 pip 人们不想要这个功能,至少现在是这样。真可惜!
  • @ThomasVanderStichele 因为那样的话,未来的 Google 员工将无法在线获得答案 :)
  • @Mark 会的,您只需在此处写下您自己问题的答案即可。
  • @ThomasVanderStichele:我不是 OP,但这就是为什么这是对 SO 的一个非常合法的问答:pip 是 a)出了名的脆弱和版本相关,也 b)在某些客户安装中我必须使用它,它是用管理员权限安装的(尽管软件包不是),因此破坏或卸载它是巨大的悲痛,你有一个机会做对。 c) 互联网连接可能不是很好;出于安全原因,公司机器通常有防火墙,所以你不能假设直接连接,你必须提前知道你需要的一切和它的版本,然后下载。

标签: python packages pip


【解决方案1】:

您可以安装和使用pip-autoremove 实用程序来删除软件包以及未使用的依赖项。

# install pip-autoremove
pip install pip-autoremove
# remove "somepackage" plus its dependencies:
pip-autoremove somepackage -y

【讨论】:

  • 不幸的是,它还没有真正的 Python3 支持(参见 github.com/invl/pip-autoremove/issues/18)。
  • 截至 2019 年 10 月,我在 Python 3 中运行良好。
  • @loved.by.Jesus - 我在 python 3.8.3 上进行了测试,但仍然看到以pip-autoremove 执行的命令(破折号不是下划线)。 pip_autoremove 给我command not found
  • @bwv549 我必须解释一下我是通过python<version> 执行的(当必须指定版本时)。这样,我们需要将名称调整为pip_autoremove(不允许使用破折号作为包名)。例如 python3.8 pip_autoremove 有效,但 python3.8 pip-autoremove 无效。否则,正如您所指出的,作为简单的终端命令pip-autoremove,它可以完美运行:)——尽管只使用了系统的默认 python 版本。感谢您的留言。
  • 在 Windows ModuleNotFoundError: No module named 'pip_autoremove' (github.com/invl/pip-autoremove/issues/43) 上不起作用
【解决方案2】:

不,它不会卸载依赖包。它只删除指定的包:

$ pip install specloud
$ pip freeze # all the packages here are dependencies of specloud package

无花果==0.6.1
鼻子==1.1.2
木偶奇遇记==0.3
specloud==0.4.5

$ pip uninstall specloud
$ pip freeze

无花果==0.6.1
鼻子==1.1.2
木偶奇遇记==0.3

如您所见,这些包是来自 specloud 的依赖项,它们仍然存在,但不是 specloud 包本身。

如下所述,您可以安装和使用pip-autoremove 实用程序来删除软件包以及未使用的依赖项。

【讨论】:

  • specloud包的专属依赖包呢?
  • @Fusion 这些包是 specloud 的依赖。
  • 改写@Fusion 的问题,如果您已经安装了另一个包(并且该包有自己的依赖项),您将无法区分哪些依赖项属于哪个包。这种方法只有在你有一个干净的初始(虚拟)环境时才有效。
【解决方案3】:

我已使用此 bash 行成功删除了包的依赖项:

for dep in $(pip show somepackage | grep Requires | sed 's/Requires: //g; s/,//g') ; do pip uninstall -y $dep ; done

这适用于 pip 1.5.4

【讨论】:

  • 虽然从技术上讲,此解决方案 确实 成功删除了所有依赖项,如其他答案中所述,它卸载了 不是目标独有的,包括从系统包安装的。例如,在我的系统上,这个脚本最终失败了,因为目标包与 pip 有共同的依赖项,所以 pip 在脚本完成之前卸载了自己的依赖项,然后失败了。
  • 请注意,这会删除下一级的依赖项,但不会删除这些依赖项的依赖项。
【解决方案4】:

我已经找到了解决方案,尽管对某些人来说执行起来可能有点困难。

第一步(python3和linux):

pip3 install pip-autoremove  

第二步:

cd /home/usernamegoeshere/.local/bin/  

第三步:

gedit /home/usernamegoeshere/.local/lib/python3.8/site-packages/pip_autoremove.py  

并将所有 pip(s) 更改为 pip3
第四步:

./pip-autoremove packagenamegoeshere  

至少,这对我有用...

【讨论】:

    【解决方案5】:

    你可以试试https://github.com/cls1991/pef。 它将删除包含所有依赖项的包。

    【讨论】:

    • 不幸的是,pef 似乎只能在虚拟环境中工作。
    • 只是出于安全考虑,您可以破解密码,只需关闭保护密码即可。
    • 它是否确保这些依赖项是“悬空的”,即其他发行版不需要?
    • 是的,它基于引用计数。
    • 大家好,我已经分叉并修改了代码。请在下面找到链接。 github.com/nalangekrushna/pef
    猜你喜欢
    • 2016-03-02
    • 2021-12-08
    • 2020-10-01
    • 2011-11-11
    • 2021-11-16
    • 2018-10-10
    • 1970-01-01
    • 2020-10-19
    • 2019-03-18
    相关资源
    最近更新 更多