Czy odinstalowanie pakietu za pomocą „pip” powoduje również usunięcie pakietów zależnych?

153

Podczas pipinstalowania pakietu wszystkie wymagane pakiety zostaną również zainstalowane wraz z nim (zależności). Czy odinstalowanie tego pakietu powoduje również usunięcie pakietów zależnych?

Hossein
źródło
1
Dlaczego nie możesz tego po prostu spróbować i zobaczyć? Zrobiłbym dokładnie to, aby odpowiedzieć na twoje pytanie, ale z jakiegoś powodu pip nie może teraz pobrać indeksu pakietów.
Thomas Vander Stichele
1
W grupie dyskusyjnej pip odkryłem, że ludzie z pip nie chcą tej funkcjonalności, przynajmniej na razie. Jaka szkoda!
Michel Samia
4
@ThomasVanderStichele, ponieważ wtedy odpowiedź nie byłaby dostępna online dla przyszłych Googlersów :)
Mark
1
@Zaznacz, że tak, po prostu zapisz tutaj odpowiedź na swoje pytanie.
Thomas Vander Stichele
5
@ThomasVanderStichele: Nie jestem operatorem, ale oto dlaczego jest to bardzo uzasadnione pytania i odpowiedzi dla SO: pipjest a) notorycznie kruche i zależne od wersji, również b) w niektórych instalacjach klientów, z którymi musiałem pracować, został zainstalowany z uprawnienia administratora (chociaż pakiety nie były), stąd zerwanie lub odinstalowanie go było ogromnym żalem i miałeś jedną szansę, aby zrobić to dobrze. c) łączność internetowa może nie być świetna; Ze względów bezpieczeństwa komputery firmowe są często chronione firewallem, więc nie można zakładać bezpośredniej łączności i trzeba z wyprzedzeniem znać wszystko, czego będziesz potrzebować, oraz znać jego wersję, a następnie je pobrać.
smci

Odpowiedzi:

80

Nie, nie odinstalowuje pakietów zależności. Usuwa tylko określony pakiet:

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

figleaf == 0,6,1
nos == 1,1,2 pinokio
== 0,3
mgła szklista == 0,4,5

$ pip uninstall specloud
$ pip freeze

figleaf == 0,6,1
nos == 1,1,2 pinokio
== 0,3

Jak widać, te pakiety są zależnościami od specloudi nadal istnieją, ale nie specloudsam pakiet.

Jak wspomniano poniżej, możesz zainstalować i użyć narzędzia pip-autorove , aby usunąć pakiet oraz nieużywane zależności.

BernardoBarreto
źródło
2
A co z ekskluzywnymi pakietami zależności specloud?
Fusion,
@Fusion Te pakiety są zależnością specloud.
BernardoBarreto
250

Możesz zainstalować i użyć narzędzia pip-autorove , aby usunąć pakiet oraz nieużywane zależności.

# install pip-autoremove
pip install pip-autoremove
# remove "somepackage" plus its dependencies:
pip-autoremove somepackage -y
bwv549
źródło
9
Niestety nie ma jeszcze prawdziwej obsługi Python3 (patrz github.com/invl/pip-autoremove/issues/18 ).
asmaier
10
Działa dobrze dla mnie w Pythonie 3 od października 2019 r.
przekąski
@oved.by.Jesus - korzystam z Pythona 3.8.3 i przetestowałem i nadal widzę wykonywane polecenie jako pip-autoremove(myślnik, a nie podkreślenie). pip_autoremovedaje mi command not found.
bwv549
@ bwv549 Muszę wyjaśnić, że wykonałem to przez python<version>(kiedy trzeba określić wersję). W ten sposób musimy dostosować nazwę do pip_autoremove(myślnik nie jest dozwolony jako nazwa pakietu). Na przykład python3.8 pip_autoremovedziała, ale python3.8 pip-autoremovenie. W przeciwnym razie, jak zauważyłeś, jako proste polecenie terminala pip-autoremovedziała idealnie :) - chociaż używana jest tylko domyślna wersja systemu w Pythonie. Dzięki za wiadomość.
kochany przez Jezusa
9

pomyślnie usunąłem zależności pakietu przy użyciu tej linii bash:

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

to działało na pip 1.5.4

linibou
źródło
40
Chociaż technicznie rozwiązanie to ma skutecznie usunąć wszystkie zależności, jak wspomniano w innych odpowiedzi, to również odinstalowuje zależności, które są nie jedyne do celu , w tym te, które z zainstalowanych pakietów systemowych. Na przykład w moim systemie ten skrypt ostatecznie się nie powiódł, ponieważ pakiet docelowy miał wspólne zależności z pip, więc program pip odinstalował swoje własne zależności, zanim skrypt mógł zakończyć, a następnie zawiódł.
sinisterstuf
19
Uważaj, to usuwa tylko zależności niższego poziomu, ale nie zależności tych zależności.
tamakisquare
0

Znalazłem rozwiązanie, chociaż niektórym może to być trudne do wykonania.

1. krok (dla Python3 i Linux):
pip3 zainstaluj pip-autorove
2. krok:
cd /home/usernamegoeshere/.local/bin/
3. krok:
gedit /home/usernamegoeshere/.local/lib/python3.8/site-packages/ pip_autoremove.py
i zmień wszystkie pip (i) na pip3 4 krok: ./pip-autoremove packagenamegoeshere

Przynajmniej to zadziałało dla mnie ...

david david
źródło
-1

Możesz spróbować https://github.com/cls1991/pef . Usunie pakiet ze wszystkimi jego zależnościami.

cls1991
źródło
Niestety pef wydaje się działać tylko w środowiskach wirtualnych.
Bas
To tylko ze względów bezpieczeństwa, możesz zhakować kod, po prostu wyłącz kod ochronny.
cls1991
1
Czy zapewnia, że ​​te zależności „wiszą”, czyli nie są potrzebne innym dystrybucjom?
wim
Tak, opiera się na liczeniu referencji.
cls1991
hej chłopaki, rozwidliłem i zmodyfikowałem kod. Proszę znaleźć link poniżej. github.com/nalangekrushna/pef
Krissh