Qual é a maneira mais fácil de remover todos os pacotes instalados pelo pip?

616

Estou tentando consertar um dos meus virtualenvs - gostaria de redefinir todas as bibliotecas instaladas para as que correspondem à produção.

Existe uma maneira rápida e fácil de fazer isso com o pip?

blueberryfields
fonte
10
@patelshahrukh desinstalar python NÃO remove pacotes pip. por favor EVITAR fazer isso, uma vez que ambos provavelmente não vai funcionar da maneira que você acha que vai, e , dependendo de como você instalar o python, novamente, pode deixar a sua máquina em um estado instável que é mais trabalho para correção .
blueberryfields
isso pode ajudar para pacotes instalados no modo de desenvolvimento ou no modo editável: stackoverflow.com/questions/17346619/…
Charlie Parker

Respostas:

924

Encontrei esse trecho como uma solução alternativa. É uma remoção mais graciosa das bibliotecas do que refazer o virtualenv:

pip freeze | xargs pip uninstall -y

Caso você tenha pacotes instalados via VCS, é necessário excluir essas linhas e remover os pacotes manualmente (elevado a partir dos comentários abaixo):

pip freeze | grep -v "^-e" | xargs pip uninstall -y
blueberryfields
fonte
4
Acho essa uma boa solução, simplesmente porque não remove completamente o ambiente virtual - eu posso ter feito alterações, por exemplo, postactivatequais permanecerão.
Niceguydave #
5
Depois de executar isso, percebi que ele removeu o setuptoolspacote. Resolvi o problema seguindo as instruções aqui: stackoverflow.com/questions/7446187/…
Dan
1
@ gerty3000 sim, isso (como a pergunta faz) remove todos os pacotes instalados em um ambiente virtual. em seu ambiente, talvez as ferramentas de instalação sejam melhor instaladas em um local global?
campos de mirtilo
7
Você também pode usar pip freeze --exclude-editable | xargs pip uninstall -ya ignorar pacotes VCS sem o uso de um padrão grep
Connor Brinton
2
E pacotes editáveis desinstalação ver stackoverflow.com/questions/17346619
Dan Oak
318

Isso funcionará para todos os sistemas Mac, Windows e Linux. Para obter a lista de todos os pacotes pip no arquivo requirements.txt (Nota: Isso substituirá o arquivo requirements.txt, se existir mais, criará o novo, também se você não quiser substituir o antigo requirements.txt, dê um nome de arquivo diferente no comando a seguir, no local requirements.txt).

pip freeze > requirements.txt

Agora, para remover um por um

pip uninstall -r requirements.txt

Se queremos remover tudo de uma vez, então

pip uninstall -r requirements.txt -y

Se você estiver trabalhando em um projeto existente com um requirements.txtarquivo e seu ambiente divergir, basta substituirrequirements.txt os exemplos acima por toberemoved.txt. Depois de seguir as etapas acima, você pode usar o requirements.txtpara atualizar seu ambiente agora limpo.

E para comando único sem criar nenhum arquivo (como @joeb sugeriu).

pip uninstall -y -r <(pip freeze)
Harshad Kavathiya
fonte
11
provavelmente vale a pena mencionar que você força a substituição do arquivo requirements.txt, caso eles não saibam. :)
Dave Gregory
4
Além disso, se alguém quiser remover todos os pacotes, o acréscimo de "-y" fará isso. Exemplo:pip uninstall -r requirements.txt -y
David Metcalfe
58
Você pode usar pip uninstall -y -r <(pip freeze)para fazer tudo de uma só vez.
9118 johson
1
@ joeb sim, podemos fazer assim também.
Harshad Kavathiya
1
@HarshadKavathiya você pode usar outro arquivo para congelar Conservar pip, como "current.txt", de modo requirements.txt pode ficar aplausos intocadas
NikosKeyz
118

Isso funciona com o mais recente. Eu acho que é a maneira mais curta e mais declarativa de fazer isso.

virtualenv --clear MYENV

Mas geralmente eu apenas apago e recrio o virtualenv, já que as regras de imutabilidade!

Robert Moskal
fonte
7
Isso é efetivamente o mesmo que correr wipeenv? virtualenvwrapper.readthedocs.org/en/latest/…
Taylor Edmiston,
Na verdade - parece (pelo que acabei de encontrar), wipeenvenquanto no ambiente gera um erro e não remove nada se usado no contexto de uma pip install -econstrução de desenvolvimento, tentar usá-lo virtualenv --clear MYENVnão gera um erro e remove nenhum dos pacotes que você pode ter instalado anteriormente no ambiente. Pelo menos este é o caso no OSX. Veja bitbucket.org/dhellmann/virtualenvwrapper/issues/211/… para mais informações.
Mp4
2
wipeenvé um alias fornecido pelo virtualenvwrapper; portanto, nem todo mundo o possui.
Jonathan Hartley
2
bem, isso é meio que um truque sujo, mas funciona como mágica. Eu preferiria que todos usassem a desinstalação do pip -r requirements.txt -y. Faz uma ótima limpeza.
Muema 09/03
84

Eu queria elevar esta resposta de uma seção de comentários porque é uma das soluções mais elegantes do segmento. O crédito total desta resposta vai para @joeb .

pip uninstall -y -r <(pip freeze)

Isso funcionou muito bem para mim no caso de uso de limpar minha pasta de pacotes de usuários fora do contexto de um virtualenv com o qual muitas das respostas acima não tratam.

Edit: Alguém sabe como fazer esse comando funcionar em um Makefile?

Bônus: um alias do bash

Eu adiciono isso ao meu perfil do bash por conveniência:

alias pipuninstallall="pip uninstall -y -r <(pip freeze)"

Então corra:

pipuninstallall

Alternativa para pipenv

Se você estiver usando o pipenv, basta executar:

pipenv uninstall --all
Taylor Edmiston
fonte
8
Deve facilmente ser # 1
Mark
Eu gosto, mas não funciona no caso nulo ( pip freezeresulta em nada se nenhum pacote estiver instalado e, em seguida pip uninstall, reclama, infelizmente).
Eric G
Hmm boa captura. Talvez ele possa ser envolvido em uma função bash que verifica se a saída de congelamento do pip está vazia. Não vejo uma ótima maneira de conseguir isso, mantendo o comando em uma única linha curta e agradável.
Taylor Edmiston
1
make uses sh por padrão, mas a sintaxe da substituição <(...)é um bashism. Portanto, você pode usar o bash -c "..." ou contornar fazendo umpip freeze | pip uninstall -r /dev/stdin
Caesar
Não funciona com os Notebooks do Azure:ERROR: Cannot uninstall 'bitarray'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
SeaDude em
54

Outras respostas que usam pip listou pip freeze devem incluir--local outra coisa, também desinstalarão pacotes encontrados nos namespaces comuns.

Então, aqui estão os trechos que eu uso regularmente

 pip freeze --local | xargs pip uninstall -y

Ref: pip freeze --help

nehem
fonte
Boa resposta ... funcionou para mim #
igorkf 19/12/19
Isso funcionou até que ele atingiu um pacote que produziu este erro: ERROR: Cannot uninstall 'bitarray'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.. Então não consegui desinstalar mais nenhum módulo.
SeaDude 30/04
39

Método 1 (com pip freeze)

pip freeze | xargs pip uninstall -y

Método 2 (com pip list)

pip list | awk '{print $1}' | xargs pip uninstall -y

Método 3 (com virtualenv)

virtualenv --clear MYENV
Suriyaa
fonte
2
O sudo não é necessário e provavelmente é perigoso de usar sem uma consideração cuidadosa, pois afeta a configuração global da máquina. veja esta resposta por exemplo: stackoverflow.com/questions/15028648/…
blueberryfields
6
Método 2 ( pip list) funciona muito bem até que você tenha pip acidentalmente desinstalar-se -_-
Justin
20

Eu consegui fazer o seguinte:

Crie o arquivo de requisitos chamado reqs.txt com a lista de pacotes atualmente instalados

pip freeze > reqs.txt

depois desinstale todos os pacotes de reqs.txt

pip uninstall \
   -y # remove the package with prompting for confirmation
   -r reqs.txt

Eu gosto desse método, pois você sempre tem um arquivo de requisitos de pip para recorrer caso cometa um erro. Também é repetível.

Prime By Design
fonte
Simples e elegante, funciona como charme
Satyaaditya
19

A maneira mais rápida é refazer completamente o virtualenv. Presumo que você tenha um arquivo requirements.txt que corresponda à produção, se não:

# On production:
pip freeze > reqs.txt

# On your machine:
rm $VIRTUALENV_DIRECTORY
mkdir $VIRTUALENV_DIRECTORY
pip install -r reqs.txt
Ned Batchelder
fonte
2
Isso até lida com o caso em que houve uma instalação editável (basicamente uma instalação em modo de desenvolvimento de ferramentas de instalação) que criou um arquivo .egg-info local que interferiu no restante do processo de instalação / desinstalação? Como é um conjunto de arquivos, parece não saber como lidar com a presença deles, e, em vez de desinstalar qualquer coisa, torna uma estrutura de diretório local sob MYENV completa com: `> Novos executáveis ​​python em MYENV / bin / python3.4> Também criando executável em MYENV / bin / python> Instalando ferramentas de instalação, pip, roda ... concluídas. Mas o MYENV não redefiniu o ambiente!
Mpacer
16

No Windows, se o seu pathestiver configurado corretamente, você pode usar:

pip freeze > unins && pip uninstall -y -r unins && del unins

Deve ser um caso semelhante para sistemas do tipo Unix:

pip freeze > unins && pip uninstall -y -r unins && rm unins

Apenas um aviso de que isso não é totalmente sólido, pois você pode encontrar problemas como 'Arquivo não encontrado', mas, em alguns casos, pode funcionar em alguns casos

EDIT: Para maior clareza: uninsé um arquivo arbitrário que possui dados gravados quando este comando executa:pip freeze > unins

O arquivo que ele escreveu por sua vez é usado para desinstalar os pacotes mencionados com consentimento implícito / aprovação prévia via pip uninstall -y -r unins

O arquivo é finalmente excluído após a conclusão.

Richard Kenneth Niescior
fonte
14

Usando a função virtualenvwrapper :

wipeenv

Consulte a documentação do wipeenv

zesk
fonte
6
Se você estiver usando virtualenvwrapper, digitewipeenv
raratiru 24/10
@raratiru, ótimo, agora meus colegas de trabalho provavelmente estão se perguntando por que eu cuspi café em todo o teclado
Brian Joseph
@BrianJoseph Damn! Caí da cadeira ... obrigado!
raratiru 13/12/19
14

Primeiro, adicione todo o pacote ao requirements.txt

pip freeze > requirements.txt

Em seguida, remova todos

pip uninstall -y -r requirements.txt 
shafik
fonte
9

É uma pergunta antiga, eu sei, mas me deparei com ela. Para referência futura, agora você pode fazer isso:

pip uninstall [options] <package> ...
pip uninstall [options] -r <requirements file> ...

-r, - arquivo de requisito

Desinstale todos os pacotes listados no arquivo de requisitos fornecido. Esta opção pode ser usada várias vezes.

da documentação do pip versão 8.1

Craicerjack
fonte
8

Para usuários do Windows, é isso que eu uso no Windows PowerShell

 pip uninstall -y (pip freeze)
benwrk
fonte
6

(adicionando isso como resposta, porque não tenho reputação suficiente para comentar a resposta de @blueberryfields)

A resposta de @blueberryfields funciona bem, mas falha se não houver um pacote para desinstalar (o que pode ser um problema se esse "desinstalar tudo" fizer parte de um script ou makefile). Isso pode ser resolvido xargs -rao usar a versão do GNU de xargs:

pip freeze --exclude-editable | xargs -r pip uninstall -y

de man xargs:

-r, --no-run-if-empty

Se a entrada padrão não contiver nenhum espaço em branco, não execute o comando. Normalmente, o comando é executado uma vez, mesmo que não haja entrada. Esta opção é uma extensão GNU.

Thibaut Dubernet
fonte
6
pip3 freeze --local | xargs pip3 uninstall -y

Pode ser que alguém precise executar esse comando várias vezes para obter um vazio pip3 freeze --local.

obotezat
fonte
3

Essa foi a maneira mais fácil de desinstalar todos os pacotes python.

from pip import get_installed_distributions
from os import system
for i in get_installed_distributions():
    system("pip3 uninstall {} -y -q".format(i.key))
Anônimo 138
fonte
2

Suporte entre plataformas usando apenas pip:

#!/usr/bin/env python

from sys import stderr
from pip.commands.uninstall import UninstallCommand
from pip import get_installed_distributions

pip_uninstall = UninstallCommand()
options, args = pip_uninstall.parse_args([
    package.project_name
    for package in
    get_installed_distributions()
    if not package.location.endswith('dist-packages')
])

options.yes = True  # Don't confirm before uninstall
# set `options.require_venv` to True for virtualenv restriction

try:
    print pip_uninstall.run(options, args)
except OSError as e:
    if e.errno != 13:
        raise e
    print >> stderr, "You lack permissions to uninstall this package.
                      Perhaps run with sudo? Exiting."
    exit(13)
# Plenty of other exceptions can be thrown, e.g.: `InstallationError`
# handle them if you want to.
Samuel Marks
fonte
2

Este é o comando que funciona para mim:

pip list | awk '{print $1}' | xargs pip uninstall -y
Fei Xie
fonte
2

A maneira fácil e robusta de plataforma cruzada e o trabalho em pipenv também é:

pip freeze 
pip uninstall -r requirement

por pipenv:

pipenv run pip freeze 
pipenv run pip uninstall -r requirement

mas não atualizará o piplock ou o pipfile, esteja ciente

Mahdi Hamzeh
fonte
1

Se você estiver executando virtualenv:

virtualenv --clear </path/to/your/virtualenv>

por exemplo, se seu virtualenv for /Users/you/.virtualenvs/projectx, você executaria:

virtualenv --clear /Users/you/.virtualenvs/projectx

se você não souber onde seu ambiente virtual está localizado, poderá executar a which pythonpartir de um ambiente virtual ativado para obter o caminho

punkrockpolly
fonte
1

No meu caso, eu acidentalmente instalei vários pacotes globalmente usando um Homebrew instalado pipno macOS. A maneira mais fácil de reverter para os pacotes padrão era simples:

$ brew reinstall python

Ou, se você estava usando pip3:

$ brew reinstall python3
Radon Rosborough
fonte
Esta resposta pressupõe muito sobre o ambiente e não resolve diretamente o problema se você estiver usando o pyenv, por exemplo.
Mark
@ Mark Bem, se você estiver usando pyenv, precisará fazer algo diferente. No caso comum que você não é, acredito que esta é a solução mais simples e menos invasiva. Observe que essa condição é explicitamente declarada no início da resposta.
Radon Rosborough
O OP perguntou sobre virtualenvs. Ele não fez nenhuma menção específica ao uso de um Mac ou brew para instalar o Python. Portanto, você não pode assumir que o sistema operacional ou a mistura foi usada - e esta resposta não resolverá TODAS as condições. Se você se concentrar em resolver o ambiente usando uma ferramenta como o pip - abordará o contexto do ambiente em que está. Espero que isso faça sentido.
Mark Mark
1
@ Mark Eu entendo sua posição. Podemos concordar em discordar. Eu só quero ajudar as pessoas do Google que clicam em um link chamado "Qual é a maneira mais fácil de remover todos os pacotes instalados pelo pip?" quando eles realmente querem remover todos os pacotes instalados globalmente pelo pip.
Radon Rosborough
Concordado com @RadonRosborough, o título do link é representativo do motivo pelo qual cheguei aqui, mesmo que o OP realmente não faça a mesma pergunta.
23917 Kenn Kennesta
1

No Shell de Comando do Windows, o comando pip freeze | xargs pip uninstall -ynão funciona. Portanto, para aqueles que usam o Windows, descobri uma maneira alternativa de fazer isso.

  1. Copie todos os nomes dos pacotes instalados do pip do pip freezecomando para um arquivo .txt arquivo .
  2. Em seguida, vá para o local do seu arquivo .txt e execute o comandopip uninstall -r *textfile.txt*
Sushant Chaudhary
fonte
1

Se você estiver usando pew, poderá usar o comando wipeenv :

pew wipeenv [env]

Mohammad Banisaeid
fonte
1

Eu uso a opção --user para desinstalar todos os pacotes instalados no site do usuário.

congelador pip3 - usuário | Desinstalação do xargs pip3 -y

reitor
fonte
Acredito que esta resposta não adicione muitas informações novas, eu preferiria sugerir uma melhoria para outra resposta semelhante já existente, como esta: stackoverflow.com/a/45475070/11138259
sinoroc 03/04
-1

O Pip não tem como saber quais pacotes foram instalados por ele e quais pacotes foram instalados pelo gerenciador de pacotes do seu sistema. Para isso, você precisaria fazer algo assim

para distribuições baseadas em rpm (substitua python2.7 pela sua versão python com a qual você instalou o pip):

find /usr/lib/python2.7/ |while read f; do
  if ! rpm -qf "$f" &> /dev/null; then
    echo "$f"
  fi
done |xargs rm -fr

para uma distribuição baseada em deb:

find /usr/lib/python2.7/ |while read f; do
  if ! dpkg-query -S "$f" &> /dev/null; then
    echo "$f"
  fi
done |xargs rm -fr

em seguida, para limpar os diretórios vazios restantes:

find /usr/lib/python2.7 -type d -empty |xargs rm -fr

Achei a resposta principal muito enganadora, pois ela removerá todos (a maioria?) Dos pacotes python da sua distribuição e provavelmente o deixará com um sistema quebrado.

Glenda
fonte
Com todo o respeito, isso parece comparável. Por que não dpkg-query -S '/usr/lib/python2.7/*', extraia os nomes e dpkg-query -Lcada nome para despejar os arquivos associados? Já possui os manifestos preparados. Minha principal objeção é que, em vez de direcionar pacotes instalados em qualquer lugar, exceto pelo pip, você direcionou os pacotes instalados por qualquer coisa que não seja o gerente que você espera, e em um local que o pip geralmente não deve tocar. pip list -llista os pacotes que ele instalou localmente, e alguns o farão pip install --target=.... A remoção de todos os diretórios atualmente vazios também o morderá!
John P