A desinstalação de um pacote com "pip" também remove os pacotes dependentes?

153

Quando você usa pippara instalar um pacote, todos os pacotes necessários também serão instalados (dependências). A desinstalação desse pacote também remove os pacotes dependentes?

Hossein
fonte
1
Por que você não pode simplesmente tentar e ver? Eu faria exatamente isso para responder à sua pergunta, mas por algum motivo o pip não pode obter o índice do pacote aqui agora.
Thomas Vander Stichele 27/10
1
Eu descobri no grupo de notícias pip que as pessoas pip não querem essa funcionalidade, pelo menos por enquanto. Que pena!
Michel Samia
4
@ThomasVanderStichele porque então a resposta não estaria disponível on-line para futuras Googlers :)
Mark
1
@ Mark seria, você acabou de escrever a resposta para sua própria pergunta aqui.
Thomas Vander Stichele
5
@ThomasVanderStichele: Eu não sou o OP, mas eis por que este é um Q&A muito legítimo para SO: pipa) é notoriamente quebradiço e depende da versão, também b) em algumas instalações de clientes com as quais tive que trabalhar, ele foi instalado com direitos de administrador (embora os pacotes não fossem), portanto, quebrar ou desinstalar era uma dor enorme e você tinha uma chance de fazer o que era certo. c) a conectividade com a internet pode não ser ótima; por motivos de segurança, as máquinas corporativas geralmente são protegidas por firewall, portanto você não pode assumir a conectividade direta e precisa saber com antecedência tudo o que precisa e sua versão, e fazer o download.
smci 13/05/19

Respostas:

80

Não, ele não desinstala os pacotes de dependências. Ele remove apenas o pacote especificado:

$ 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
nariz = 1.1.2
pinóquio == 0,3

Como você pode ver, esses pacotes são dependências specloude ainda estão lá, mas não o specloudpróprio pacote.

Conforme mencionado abaixo, você pode instalar e usar o utilitário pip-autoremove para remover um pacote mais as dependências não utilizadas.

BernardoBarreto
fonte
2
E os pacotes de dependência exclusivos do specloudpacote?
Fusion
@Fusion Esses pacotes são dependentes do specloud.
BernardoBarreto
250

Você pode instalar e usar o utilitário pip-autoremove para remover um pacote mais as dependências não utilizadas.

# install pip-autoremove
pip install pip-autoremove
# remove "somepackage" plus its dependencies:
pip-autoremove somepackage -y
bwv549
fonte
9
Infelizmente, ainda não há suporte real ao Python3 (consulte github.com/invl/pip-autoremove/issues/18 ).
Asmaier 6/10/19
10
Trabalhando bem para mim no Python 3 a partir de outubro de 2019.
snacks
@ loved.by.Jesus - Estou no python 3.8.3 e testei e ainda vejo o comando executado como pip-autoremove(traço não sublinhado). pip_autoremoveme dá command not found.
bwv549 19/06
@ bwv549 Tenho de explicar que o executei via python<version>(quando a versão tiver que ser especificada). Dessa forma, precisamos adaptar o nome a pip_autoremove(dash não é permitido como nome do pacote). Por exemplo, python3.8 pip_autoremovefunciona, mas python3.8 pip-autoremovenão funciona . Caso contrário, como você apontou, como simples comando terminal pip-autoremove, ele funciona perfeitamente :) - embora apenas a versão python padrão do sistema seja usada. Obrigado pela sua mensagem.
loved.by.Jesus
9

Eu removi com sucesso as dependências de um pacote usando esta linha do bash:

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

isso funcionou no pip 1.5.4

linibou
fonte
40
Embora tecnicamente esta solução não remover com êxito todas as dependências, como mencionado em outras respostas, ele também desinstala dependências que são não é exclusivo para o alvo , incluindo os instalados a partir de pacotes do sistema. Por exemplo, no meu sistema, esse script acabou falhando porque o pacote de destino tinha dependências em comum com o pip, portanto o pip desinstalou suas próprias dependências antes que o script pudesse terminar e depois falhou.
2141616 sinisterstuf
19
Cuidado, isso remove apenas o próximo nível de dependência, mas não as dependências dessas dependências.
Tamakisquare
0

Eu encontrei a solução, embora possa ser um pouco difícil para alguns executar.

1º passo (para python3 e linux):
pip3 instala o pip-autoremove
2º passo:
cd /home/usernamegoeshere/.local/bin/
3º passo:
gedit /home/usernamegoeshere/.local/lib/python3.8/site-packages/ pip_autoremove.py
e altere todos os pip (s) para pip3 4º passo: ./pip-autoremove packagenamegoeshere

Pelo menos, foi isso que funcionou para mim ...

david david
fonte
-1

Você pode tentar https://github.com/cls1991/pef . Ele removerá o pacote com todas as suas dependências.

cls1991
fonte
Infelizmente, o pef parece funcionar em ambientes virtuais.
Bas
É apenas por considerações de segurança, você pode hackear o código, basta desligar o código de proteção.
Cls1991
1
Isso garante que essas dependências estejam "pendentes", ou seja, desnecessárias por outras distribuições?
Wim
Sim, é baseado na contagem de referência.
Cls1991
Ei pessoal, eu bifurquei e modifiquei o código. Por favor, encontre o link abaixo. github.com/nalangekrushna/pef
Krissh