Чи видаляє пакет з "pip" також видалення залежних пакетів?


153

Коли ви використовуєте pipдля встановлення пакету, всі необхідні пакети також будуть встановлені разом з ним (залежності). Чи видаляє цей пакет також видалення залежних пакетів?


1
Чому ви не можете просто спробувати і побачити? Я би зробив саме це, щоб відповісти на ваше запитання, але чомусь pip зараз не може отримати індекс упаковки.
Томас Вандер Стіхеле

1
Я знайшов у групі новин pip, що люди, які користуються піп, не хочуть цієї функціональності, принаймні поки що. Який пит!
Мішель Самія

4
@ThomasVanderStichele, оскільки тоді відповідь не буде доступна в Інтернеті для майбутніх Googlers :)
Марк

1
@Зазначте це було б, ви просто запишіть тут відповідь на власне запитання.
Thomas Vander Stichele

5
@ThomasVanderStichele: Я не ОП, але ось чому це дуже законний Q & A для SO: pipце) сумно крихкі та залежні від версій, також b) у деяких встановленнях клієнта, з якими мені довелося працювати, він був встановлений з права адміністратора (хоча пакунків не було), отже, зламати чи видалити його було величезне горе, і у вас був один кадр, щоб зробити це правильно. в) підключення до Інтернету може бути не надто великим; з міркувань безпеки часто використовуються корпоративні машини, тому ви не можете взяти на себе прямий зв'язок, і ви повинні заздалегідь знати все, що вам потрібно, та його версію, та завантажити її.
smci

Відповіді:


80

Ні, він не видаляє пакети залежностей. Він видаляє лише вказаний пакет:

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

figleaf == 0.6.1
ніс == 1.1.2
піноккіо == 0,3
екземпляр == 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 Ці пакети є залежністю спектру.
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/isissue/18 ).
asmaier

10
Добре працює для мене в Python 3 станом на жовтень 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, вона працює чудово :) - хоча використовується лише версія пітону системи за замовчуванням. Дякуємо за ваше повідомлення
loved.by.Ісус

9

Я успішно видалив залежності пакету за допомогою цієї лінії bash:

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

це працювало на піп 1.5.4


40
Хоча технічно це рішення дійсно успішно видалити всі залежності, як зазначено в інших відповідях, він також видаляє залежності , які є не тільки для мети , в тому числі ті , що встановлені з пакетів системи. Наприклад, у моїй системі цей скрипт врешті-решт не вдався, оскільки цільовий пакет мав спільні залежності з pip, тому pip видалив власні залежності до того, як сценарій міг закінчитись, а потім не вдався.
sinisterstuf

19
Остерігайтесь, щоб це усувало лише наступні рівні вниз залежностей, але не залежності цих залежностей.
tamakisquare

0

Я знайшов рішення, хоча це може бути дещо складно виконати.

1-й крок (для python3 та linux):
встановити pip3 pip-autoremove
2 - й крок:
cd /home/usernamegoeshere/.local/bin/
3-й крок:
gedit /home/usernamegoeshere/.local/lib/python3.8/site-packages/ pip_autoremove.py
та змінити всі pip (s) на pip3 4-й крок: ./pip-autoremovenamename пакета

Принаймні, це для мене працювало ...


-1

Ви можете спробувати https://github.com/cls1991/pef . Він видалить пакет з усіма своїми залежностями.


На жаль, pef працює лише у віртуальних середовищах.
Бас

Це лише з міркувань безпеки, ви можете зламати код, просто вимкніть код захисту.
cls1991

1
Чи гарантує це, що ці залежності "звисають", тобто не потрібні іншим розподілам?
Вім

Так, це засновано на підрахунку довідок.
cls1991

Ей, хлопці, я роздвоював і змінив код. Знайдіть посилання нижче. github.com/nalangekrushna/pef
Кріш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.