La désinstallation d'un package avec «pip» supprime-t-elle également les packages dépendants?

153

Lorsque vous utilisez pippour installer un package, tous les packages requis seront également installés avec lui (dépendances). La désinstallation de ce package supprime-t-elle également les packages dépendants?

Hossein
la source
1
Pourquoi ne pouvez-vous pas simplement l'essayer et voir? Je ferais exactement cela pour répondre à votre question, mais pour une raison quelconque, pip ne peut pas obtenir l'index des paquets ici pour le moment.
Thomas Vander Stichele
1
J'ai trouvé dans le groupe de discussion pip que les gens de pip ne veulent pas de cette fonctionnalité, du moins pour le moment. Quel dommage!
Michel Samia
4
@ThomasVanderStichele parce qu'alors la réponse ne serait pas disponible en ligne pour les futurs Googleurs :)
Mark
1
@Mark ça serait, vous écrivez simplement la réponse à votre propre question ici.
Thomas Vander Stichele
5
@ThomasVanderStichele: Je ne suis pas l'OP, mais voici pourquoi c'est une question très légitime pour SO: pipest a) notoirement fragile et dépendante de la version, également b) dans certaines installations client avec lesquelles j'ai dû travailler, il a été installé avec droits d'administrateur (bien que les packages ne l'étaient pas), donc le casser ou le désinstaller était un énorme chagrin et vous aviez une chance de le faire correctement. c) la connectivité Internet peut ne pas être excellente; pour des raisons de sécurité, les machines d'entreprise sont souvent protégées par un pare-feu, vous ne pouvez donc pas supposer une connectivité directe, et vous devez savoir à l'avance tout ce dont vous aurez besoin et sa version, et le télécharger.
smci

Réponses:

81

Non, il ne désinstalle pas les packages de dépendances. Il supprime uniquement le package spécifié:

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

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

$ pip uninstall specloud
$ pip freeze

figleaf == 0.6.1
nez == 1.1.2
pinocchio == 0.3

Comme vous pouvez le voir, ces packages sont des dépendances specloudet ils sont toujours là, mais pas le specloudpackage lui-même.

Comme mentionné ci-dessous, vous pouvez installer et utiliser l' utilitaire pip-autoremove pour supprimer un package ainsi que les dépendances inutilisées.

BernardoBarreto
la source
2
Qu'en est-il des packages de dépendance exclusifs du specloudpackage?
Fusion
@Fusion Ces packages sont la dépendance de specloud.
BernardoBarreto
251

Vous pouvez installer et utiliser l' utilitaire pip-autoremove pour supprimer un package ainsi que les dépendances inutilisées.

# install pip-autoremove
pip install pip-autoremove
# remove "somepackage" plus its dependencies:
pip-autoremove somepackage -y
bwv549
la source
9
Malheureusement, il n'a pas encore de vrai support Python3 (voir github.com/invl/pip-autoremove/issues/18 ).
asmaier
10
Fonctionne bien pour moi dans Python 3 à partir d'octobre 2019.
collations du
@oved.by.Jesus - Je suis sur python 3.8.3 et j'ai testé et je vois toujours la commande exécutée comme pip-autoremove(tiret non souligné). pip_autoremoveme donne command not found.
bwv549
@ bwv549 Je dois expliquer que je l'ai exécuté via python<version>(quand la version doit être spécifiée). De cette façon, nous devons adapter le nom à pip_autoremove(le tiret n'est pas autorisé comme nom de package). Par exemple python3.8 pip_autoremovefonctionne mais python3.8 pip-autoremovene fonctionne pas. Sinon, comme vous l'avez souligné, en tant que simple commande de terminal pip-autoremove, cela fonctionne parfaitement :) - bien que seule la version python par défaut du système soit utilisée. Merci pour votre message.
aimé.par.Jesus
9

J'ai supprimé avec succès les dépendances d'un package en utilisant cette ligne bash:

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

cela a fonctionné sur pip 1.5.4

Linibou
la source
40
Bien que techniquement cette solution ne supprime avec succès toutes les dépendances, comme mentionné dans les autres réponses, il a également désinstalle dépendances qui ne sont pas uniques à la cible , y compris ceux installés à partir de paquets du système. Par exemple, sur mon système, ce script a finalement échoué car le package cible avait des dépendances en commun avec pip, donc pip a désinstallé ses propres dépendances avant que le script puisse se terminer, puis a échoué.
sinisterstuf
19
Attention, cela supprime uniquement les dépendances de niveau inférieur, mais pas les dépendances de ces dépendances.
tamakisquare
0

J'ai trouvé la solution même si cela peut être un peu difficile pour certains à réaliser.

1ère étape (pour python3 et linux):
pip3 installe pip-autoremove
2e étape:
cd /home/usernamegoeshere/.local/bin/
3e étape:
gedit /home/usernamegoeshere/.local/lib/python3.8/site-packages/ pip_autoremove.py
et changez tous les pip en pip3 4ème étape: ./pip-autoremove packagenamegoeshere

Au moins, c'est ce qui a fonctionné pour moi ...

David David
la source
-1

Vous pouvez essayer https://github.com/cls1991/pef . Il supprimera le package avec toutes ses dépendances.

cls1991
la source
pef ne semble fonctionner que dans des environnements virtuels, malheureusement.
Bas
C'est juste pour des raisons de sécurité, vous pouvez pirater le code, il vous suffit de désactiver le code de protection.
cls1991
1
S'assure-t-il que ces dépendances sont «pendantes», c'est-à-dire inutiles par d'autres distributions?
wim
Ouais, c'est basé sur le comptage des références.
cls1991
hé les gars, j'ai forké et modifié le code. Veuillez trouver le lien ci-dessous. github.com/nalangekrushna/pef
Krissh