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?
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?
Respostas:
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
postactivate
quais permanecerão.
setuptools
pacote. Resolvi o problema seguindo as instruções aqui: stackoverflow.com/questions/7446187/…
pip freeze --exclude-editable | xargs pip uninstall -y
a ignorar pacotes VCS sem o uso de um padrão grep
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.txt
arquivo e seu ambiente divergir, basta substituirrequirements.txt
os exemplos acima por toberemoved.txt
. Depois de seguir as etapas acima, você pode usar o requirements.txt
para atualizar seu ambiente agora limpo.
E para comando único sem criar nenhum arquivo (como @joeb sugeriu).
pip uninstall -y -r <(pip freeze)
pip uninstall -r requirements.txt -y
pip uninstall -y -r <(pip freeze)
para fazer tudo de uma só vez.
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!
wipeenv
? virtualenvwrapper.readthedocs.org/en/latest/…
wipeenv
enquanto no ambiente gera um erro e não remove nada se usado no contexto de uma pip install -e
construção de desenvolvimento, tentar usá-lo virtualenv --clear MYENV
nã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.
wipeenv
é um alias fornecido pelo virtualenvwrapper; portanto, nem todo mundo o possui.
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?
Eu adiciono isso ao meu perfil do bash por conveniência:
alias pipuninstallall="pip uninstall -y -r <(pip freeze)"
Então corra:
pipuninstallall
Se você estiver usando o pipenv, basta executar:
pipenv uninstall --all
pip freeze
resulta em nada se nenhum pacote estiver instalado e, em seguida pip uninstall
, reclama, infelizmente).
<(...)
é um bashism. Portanto, você pode usar o bash -c "..." ou contornar fazendo umpip freeze | pip uninstall -r /dev/stdin
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.
Outras respostas que usam pip list
ou 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
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.
pip freeze
)pip freeze | xargs pip uninstall -y
pip list
)pip list | awk '{print $1}' | xargs pip uninstall -y
virtualenv
)virtualenv --clear MYENV
pip list
) funciona muito bem até que você tenha pip acidentalmente desinstalar-se -_-
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.
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
No Windows, se o seu path
estiver 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.
wipeenv
É 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
(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 -r
ao 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.
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))
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.
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
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 python
partir de um ambiente virtual ativado para obter o caminho
No meu caso, eu acidentalmente instalei vários pacotes globalmente usando um Homebrew instalado pip
no 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
No Shell de Comando do Windows, o comando
pip freeze | xargs pip uninstall -y
não funciona. Portanto, para aqueles que usam o Windows, descobri uma maneira alternativa de fazer isso.
pip freeze
comando para um arquivo .txt arquivo .pip uninstall -r *textfile.txt*
Se você estiver usando pew
, poderá usar o comando wipeenv :
pew wipeenv [env]
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
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.
dpkg-query -S '/usr/lib/python2.7/*'
, extraia os nomes e dpkg-query -L
cada 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 -l
lista 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á!