使用“ pip”卸载软件包还会删除相关软件包吗?


153

当您pip用来安装软件包时,所有必需的软件包也会随之安装(依赖关系)。卸载该软件包还会删除从属软件包吗?


1
你为什么不能试试看呢?我会这样做,以回答您的问题,但是由于某种原因,pip无法立即获得此处的包索引。
Thomas Vander Stichele 2011年

1
我在pip新闻组中发现,pip人们至少在现在不想要此功能。真可惜!
Michel Samia

4
@ThomasVanderStichele因为那么答案将不会在线提供的Google未来:)
马克

1
@Mark就是这样,您只需在此处写下您自己问题的答案。
Thomas Vander Stichele

5
@ThomasVanderStichele:我不是OP,但是这就是为什么这对SO来说是非常合法的问答:pip是a)非常脆弱且依赖版本,b)在一些我必须使用的客户安装中,它是与管理员权限(尽管没有软件包),因此,破坏或卸载它是一件非常痛苦的事,您可以一举完成。c)互联网连接可能不是很好;出于安全原因,公司的计算机通常采用防火墙保护,因此您无法假定直接连接,因此必须事先知道所需的一切以及其版本,然后下载。
smci,

Answers:


80

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

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

figleaf == 0.6.1
鼻子== 1.1.2
pinocchio == 0.3
specloud == 0.4.5

$ pip uninstall specloud
$ pip freeze

figleaf == 0.6.1
鼻子== 1.1.2
匹诺曹== 0.3

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

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


2
包的独占依赖specloud包呢?
Fusion

@Fusion这些软件包是specloud的依赖项。
BernardoBarreto

250

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

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

9
不幸的是,它还没有真正的Python3支持(请参阅github.com/invl/pip-autoremove/issues/18)。
asmaier

10
截至2019
零食

@ loved.by.Jesus-我在python 3.8.3上运行,我进行了测试,但仍然看到命令执行为pip-autoremove(短划线而不是下划线)。 pip_autoremove给我command not found
bwv549

@ bwv549我必须说明我是通过python<version>(必须指定版本)执行的。这样,我们需要将名称修改为pip_autoremove(不允许将破折号作为程序包名称)。例如python3.8 pip_autoremove有效,但python3.8 pip-autoremove无效。否则,正如您指出的那样,它是简单的终端命令pip-autoremove,它可以完美运行:) -尽管仅使用系统的默认python版本。感谢您的留言。
love.by.Jesus

9

我已经使用以下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上有效


40
尽管从技术上讲,此解决方案确实可以成功删除所有依赖项,如其他答案中所述,但它也可以卸载不是目标专用的依赖项,包括从系统软件包安装的依赖项。例如,在我的系统上,此脚本最终失败,因为目标软件包与pip具有共同的依赖关系,因此pip在脚本完成之前先卸载了自己的依赖关系,然后失败了。
sinisterstuf

19
请注意,这会删除下一级的依赖项,而不会删除这些依赖项的依赖项。
tamakisquare'5

0

我发现了解决方案,尽管对于某些人来说可能有点困难。

第一步(适用于python3和linux):
pip3 install pip-autoremove
第二步:
cd /home/usernamegoeshere/.local/bin/
第三步:
gedit /home/usernamegoeshere/.local/lib/python3.8/site-packages/ pip_autoremove.py
并将所有pip更改为pip3第四步:./ pip-autoremove packagenamegoeshere

至少,这是对我有用的...


-1

您可以尝试使用https://github.com/cls1991/pef。它将删除软件包及其所有依赖项。


不幸的是,pef似乎只能在虚拟环境中工作。
巴斯

出于安全考虑,您可以破解代码,只需关闭保护代码即可。
cls1991

1
是否确保这些依赖项“悬而未决”,即其他发行版本不需要它们?
WIM

是的,它基于引用计数。
cls1991 '19

嗨,我已经分叉并修改了代码。请在下面找到链接。 github.com/nalangekrushna/pef
Krissh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.