使用“pip”卸载软件包时,是否也会删除其依赖的软件包?

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

2
为什么你不能试一下看呢?我会这样做来回答你的问题,但是由于某种原因,pip现在无法正确获取包索引。 - Thomas Vander Stichele
2
我在pip newsgroup中发现pip的开发人员目前不想要这个功能。真遗憾! - Michel Samia
25
@ThomasVanderStichele因为这样答案就无法在未来的谷歌搜索结果中被找到了 :) - Mark
1
@Mark,你只需要在这里写下自己问题的答案即可。 - Thomas Vander Stichele
13
@ThomasVanderStichele: 我并不是这个问题的提问者,但这是一个非常合法的SO问答:a) pip 因版本依赖性而脆弱出名;b) 在我处理的某些客户安装中,它是以管理员权限安装的(虽然包没有),因此破坏或卸载它将是巨大的痛苦,并且你只有一次机会做对。c) 网络连接可能不好;为了安全起见,公司机器经常设置防火墙,因此你不能假设直接连接,必须事先知道你需要的所有内容及其版本,并下载。 - smci
显示剩余2条评论
9个回答

394
你可以安装并使用 pip-autoremove 工具来删除一个软件包及其未使用的依赖关系。
# install pip-autoremove
pip install pip-autoremove
# remove "somepackage" plus its dependencies:
pip-autoremove somepackage -y

22
很遗憾,它目前还没有真正的Python3支持(请参见https://github.com/invl/pip-autoremove/issues/18)。 - asmaier
18
截至2019年10月,在Python 3中对我很有效。 - stratagem
8
我使用的是Python 3.8.3,我测试了一下,仍然看到命令被执行为pip-autoremove(破折号而不是下划线)。执行pip_autoremove会显示command not found - bwv549
8
在Windows上无法使用,出现了“ModuleNotFoundError: No module named 'pip_autoremove'”错误。(https://github.com/invl/pip-autoremove/issues/43) - lamsal
16
由于pip-autoremove的开发者没有很好地维护它,所以它已经处于破损状态一年了。为了修复它(来源),你需要找到名为pip_autoremove.py的文件,它位于你的Python安装目录下的<python_root>/Scripts/,然后将它移动到<python_root>/Lib/site-packages,这样它就能正常工作了。如果你不想弄乱或危及你的系统,请不要使用已经两年没有更新且星星很少的项目pip3-autoremove。@TomoyukiAota - Atralb
显示剩余5条评论

153
不,它不会卸载依赖包。它只会移除指定的软件包:
$ pip install specloud
$ pip freeze # all the packages here are dependencies of specloud package

figleaf==0.6.1
nose==1.1.2
pinocchio==0.3
specloud==0.4.5

$ pip uninstall specloud
$ pip freeze

figleaf==0.6.1
nose==1.1.2
pinocchio==0.3

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

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


4
specloud包的独占性依赖包是什么? - Fusion
@Fusion 这些包是 specloud 的依赖项。 - Bengineer
4
如果你已经安装了另一个软件包(并且该软件包有自己的依赖项),那么你将无法区分哪些依赖项属于哪个软件包。只有在初始(虚拟)环境干净的情况下,这种方法才能起作用。重新表述@Fusion的问题是:如果您已经安装了另一个软件包(并且该软件包有自己的依赖项),则您将无法区分哪些依赖项属于哪个软件包。只有在最初的(虚拟)环境干净的情况下,此方法才有效。 - Mark
1
@Bengineer 谢谢您的回复。如果我已经删除了父级包,然后才意识到我有未使用的依赖项,那我需要重新安装父级包才能让 pip-autoremove 删除这些依赖项吗? - Lev Barenboim

15
我已成功使用这个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上运行成功。

71
虽然从技术上讲,这种解决方案确实成功地移除了所有依赖项,正如其他答案提到的那样,但它也会卸载那些不属于目标独有的依赖项,包括从系统包安装的依赖项。例如,在我的系统上,由于目标软件包与pip存在共同依赖,因此在脚本完成之前pip会先卸载自己的依赖项,然后失败了。 - sinisterstuf
37
请注意,这只会移除直接下一级的依赖项,但不会移除那些依赖项的依赖项。 - tamakisquare

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更改为pip3
第四步:

./pip-autoremove packagenamegoeshere  

至少,这是对我有效的方法...


这对我来说可行,因为可用的pip(Fedora 36)是pip --version pip 21.3.1 from /usr/lib/python3.10/site-packages/pip (python 3.10),无需进行编辑。 - Jim

1

1
pef 似乎只在虚拟环境中有效,不幸的是。 - Bas
1
这只是出于安全考虑,如果你想要破解代码,只需关闭保护代码即可。 - cls1991
1
它是否确保这些依赖项是“悬空”的,即其他发行版不需要它们? - wim
1
是的,它基于引用计数。 - cls1991
1
嘿,大家好,我已经fork并修改了这段代码。请在下面找到链接。 https://github.com/nalangekrushna/pef - Krissh
我的甚至在虚拟环境中都无法工作 .-. - Fabio Magarelli

1
如果你在Linux的venv环境中,可以使用以下命令:pip uninstall $(pip freeze) -y,这个方法在我这里非常有效。
它会列出所有已安装的依赖项,并遍历列表并使用-y参数确认卸载。

0

在RHEL7上,使用简单的pipx.x卸载module_name命令可以卸载Python包。是的,它也会删除所有依赖项。

例如:pip3.6 uninstall pandas


0
要删除项目中特定软件包的依赖项,请按照以下步骤操作:
1. 在项目外的一个新文件夹中创建一个新的虚拟环境(venv)。
python3 -m venv env

2. 激活您的新虚拟环境,并且仅在其中安装您要卸载其依赖项的软件包。
pip install YOUR-SPECIFIC-PACKAGE 

3. 将您的软件包冻结并将其命名为类似于uninstall-dependencies.txt的文件。
pip freeze --> uninstall-dependencies.txt

4. 将“uninstall-dependencies.txt”列表复制到您要从中删除特定软件包及其所有依赖项的虚拟环境中。
5. 返回到您的初始项目(如果尚未激活,请激活其环境),并使用您的新列表作为指南,删除与您要卸载的软件包相关的所有内容。
pip uninstall -y -r uninstall-dependencies.txt

"-y"命令执行卸载操作时,无需询问您确认删除每个依赖项。
6.测试您的项目,确保一切都符合您的要求。
7.不要忘记在删除软件包及其依赖项后使用pip freeze命令。
pip freeze -r requirements.txt

这将删除特定的软件包及其依赖项,同时保留项目中的其他软件包。 当然,也有可能您有多个具有相同依赖关系的软件包,这种情况下,您可以重新安装新的 requirements.txt 来重新设置它们。 这可能有点巧妙,但对我来说起到了作用。

这在功能上与Fábio Correia的回答是一样的,只是分解成了更多的步骤。 - undefined
嗨,卡尔,谢谢你的评论。我不明白为什么Fábio Correia的回答和我的一样。Fabio的答案基本上是"pip uninstall -y -r requirements.txt"。我的答案是从requirements.txt中选择特定模块,该模块带有额外的依赖项,然后仅删除该模块和其附带的依赖项。我认为这才是Hossein最初询问的内容,如果我错了,请纠正我。 - undefined

-2
我刚刚找到了一个更快的方法来做这件事
pip uninstall -y (pip freeze)

它将删除所有的依赖项

如果你想确保不会卸载对你重要的那个

你可以试试这个

pip freeze > ./python_uninstall_modules.txt
pip uninstall -r python_uninstall_modules.txt -y

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接