Удаление пакета с «pip» также удаляет зависимые пакеты?


153

Когда вы используете pipдля установки пакета, все необходимые пакеты также будут установлены вместе с ним (зависимости). Удаление этого пакета также удаляет зависимые пакеты?


1
Почему ты не можешь просто попробовать и посмотреть? Я бы сделал именно это, чтобы ответить на ваш вопрос, но по какой-то причине pip не может получить индекс пакета здесь прямо сейчас.
Томас Вандер Стичеле

1
В новостной группе pip я обнаружил, что люди pip не хотят эту функциональность, по крайней мере сейчас. Как жаль!
Мишель Самия

4
@ThomasVanderStichele, потому что тогда ответ не будет доступен онлайн для будущих гуглеров :)
Марк

1
@ Отметьте, вы просто запишите ответ на свой вопрос здесь.
Томас Вандер Стичеле

5
@ThomasVanderStichele: Я не OP, но вот почему это очень законный Q & A для SO: pipа) заведомо хрупкий и зависит от версии, а также б) в некоторых клиентских установках, с которыми мне приходилось работать, он был установлен с Права администратора (хотя пакетов не было), поэтому его нарушение или удаление было огромным горем, и у вас был один шанс сделать все правильно. в) Интернет-соединение может быть не очень хорошим; по соображениям безопасности корпоративные машины часто защищены брандмауэром, поэтому вы не можете использовать прямое подключение, и вам необходимо заранее знать все, что вам нужно, и его версию, и загрузить ее.
smci

Ответы:


81

Нет, он не удаляет пакеты зависимостей. Удаляет только указанный пакет:

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

figleaf == 0.6.1
носа == 1.1.2
буратино == 0.3
specloud == 0.4.5

$ pip uninstall specloud
$ pip freeze

фиговый лист == 0.6.1
носа == 1.1.2
буратино == 0.3

Как вы можете видеть, эти пакеты являются зависимостями, specloudи они все еще там, но не сам specloudпакет.

Как упоминалось ниже, вы можете установить и использовать утилиту pip-autoremove для удаления пакета плюс неиспользуемые зависимости.


2
Как насчет эксклюзивных пакетов зависимостей specloudпакета?
Fusion

@Fusion Эти пакеты являются зависимостью specloud.
Бернардо

251

Вы можете установить и использовать утилиту 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
Работает хорошо для меня в Python 3 с октября 2019 года.
закуски

@ love.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. Спасибо за твое сообщение.
любит.Иесус

9

я успешно удалил зависимости пакета, используя эту строку:

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 (ы) на pip3 4-й шаг: ./pip-autoremove packagenamegoeshere

По крайней мере, это было то, что работало для меня ...


-1

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


К сожалению, pef работает только в виртуальных средах.
Bas

Это просто из соображений безопасности, вы можете взломать код, просто отключив код защиты.
cls1991

1
Убедитесь, что эти зависимости «висят», то есть не нужны другим дистрибутивам?
Вим

Да, это основано на подсчете ссылок.
cls1991

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