Eu tenho um arquivo de requisitos de pip que muda durante o desenvolvimento.
Pode pip
ser feito para desinstalar os pacotes que não aparecem no arquivo de requisitos, bem como instalar aqueles que aparecem? Existe um método padrão?
Isso permitiria que o arquivo de requisitos de pip fosse a lista canônica de pacotes - uma abordagem 'se e somente se'.
Atualização : sugeri como um novo recurso em https://github.com/pypa/pip/issues/716
Respostas:
A resposta curta é não, você não pode fazer isso com pip.
fonte
pip uninstall -r requirements.txt
-y
ao comando @Ommit para evitar ter que pressionar Y e inserir muitas vezes. Aprenda com meus erros.pip uninstall -r requirements.txt
irá apenas desinstalar as versões em seu requirements.txt. Se você desinstalar,boto3==1.10.0
por exemplo,pip freeze
apareceráboto3==1.0.1
se você o instalou (ou qualquer versão anterior) anteriormente.Isso deve desinstalar tudo que não esteja em requirements.txt:
pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y
Embora isso não funcione muito bem com pacotes instalados com
-e
, ou seja, de um repositório git ou similar. Para ignorá-los, basta filtrar os pacotes começando com o-e
sinalizador:pip freeze | grep -v -f requirements.txt - | grep -v '^#' | grep -v '^-e ' | xargs pip uninstall -y
Então, obviamente:
Atualização para 2016: no entanto, você provavelmente não quer realmente usar a abordagem acima. Confira
pip-tools
epip-sync
quais realizam o que você provavelmente está procurando fazer de uma forma muito mais robusta.https://github.com/nvie/pip-tools
Atualização de maio de 2016:
Agora você também pode usar
pip uninstall -r requirements.txt
, no entanto, isso faz basicamente o oposto - desinstala tudo emrequirements.txt
Atualização de maio de 2019:
Confira pipenv . Muita coisa aconteceu no mundo do gerenciamento de pacotes que torna esse tipo de questão um pouco obsoleto. Na verdade, ainda estou muito feliz usando as ferramentas pip.
fonte
project.config
arquivo para o Django no Elastic Beanstalk:05_pip_clean: command: "pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y"
. Agora posso reverter pacotes pip sem reconstruir meu ambiente apenas usando comentários emrequirements.txt
. Isso está me economizando tempo de inatividade real. Obrigado!pip freeze
faz comentários, mas algum dia eles podem adicioná-lo à API e, se o fizerem, será válido. Se não o fizerem, então o acima é um ambiente autônomo. O traço permite que você use o stdin do comando anterior, neste caso, o traço diz ao grep para comparar o conteúdo de requirements.txt com a saída depip freeze
(a saída depip freeze
neste contexto é sinônimo de stdin)Não é uma característica do
pip
, não. Se você realmente deseja tal coisa, pode escrever um script para comparar a saídapip freeze
com a suarequirements.txt
, mas provavelmente seria mais trabalhoso do que vale a pena.Usando
virtualenv
, é mais fácil e confiável apenas criar um ambiente limpo e (re) instalarrequirements.txt
, como:deactivate rm -rf venv/ virtualenv venv/ source venv/bin/activate pip install -r requirements.txt
fonte
requirements.txt
), por que ele seria instalado novamente?Agora você pode passar o
-r requirements.txt
argumento parapip uninstall
.Pelo menos a partir de
pip
8.1.2,pip help uninstall
mostra:... Uninstall Options: -r, --requirement <file> Uninstall all the packages listed in the given requirements file. This option can be used multiple times. ...
fonte
Esta é uma pergunta antiga (mas boa), e as coisas mudaram substancialmente desde que foi feita.
Há uma referência improvisada a
pip-sync
em outra resposta, mas merece sua própria resposta, porque resolve exatamente o problema do OP.pip-sync pega um
requirements.txt
arquivo como entrada e "configura" seu ambiente Python atual para que corresponda exatamente ao que está nelerequirements.txt
. Isso inclui remover todos os pacotes que estão presentes em seu env, mas ausentes delerequirements.txt
.Exemplo: Suponha que queremos que o nosso env para conter (apenas) 3 bibliotecas:
libA
,libB
elibC
, assim:> cat requirements.txt libA==1.0 libB==1.1 libC==1.2
Mas nosso env atualmente contém
libC
elibD
:> pip freeze libC==1.2 libD==1.3
Executar pip-sync resultará nisso, que era nosso estado final desejado:
> pip-sync requirements.txt > pip freeze libA==1.0 libB==1.1 libC==1.2
fonte
A proposta de Stephen é uma boa ideia, mas infelizmente não funciona se você incluir apenas requisitos diretos em seu arquivo, o que parece mais claro para mim.
Todas as dependências serão desinstaladas, inclusive até mesmo
distribute
, quebrando-pip
se.Manter um arquivo de requisitos limpo enquanto rastreia a versão de um ambiente virtual
Aqui está como tento controlar a versão do meu ambiente virtual. Tento manter um mínimo
requirements.txt
, incluindo apenas os requisitos diretos, e nem mesmo mencionando as restrições de versão onde não tenho certeza.Além disso, mantenho e incluo no rastreamento de versão (digamos git) o status real do meu virtualenv em um
venv.pip
arquivo.Aqui está um exemplo de fluxo de trabalho:
configuração do espaço de trabalho virtualenv, com rastreamento de versão:
mkdir /tmp/pip_uninstalling cd /tmp/pip_uninstalling virtualenv venv . venv/bin/activate
inicializar o sistema de rastreamento de versão:
git init echo venv > .gitignore pip freeze > venv.pip git add .gitignore venv.pip git commit -m "Python project with venv"
instale um pacote com dependências, inclua-o no arquivo de requisitos:
Agora comece a construir seu aplicativo, em seguida, comprometa-se e inicie um novo branch:
vim myapp.py git commit -am "Simple flask application" git checkout -b "experiments"
instale um pacote extra:
... brincar com ele e depois voltar para a versão anterior
vim manage.py git commit -am "Playing with flask-script" git checkout master
Agora desinstale pacotes estranhos:
Suponho que o processo pode ser automatizado com git hooks, mas não vamos sair do tópico.
Claro, faz sentido usar algum sistema de cache de pacote ou repositório local como pip2pi
fonte
Aproveitando @ stephen-j-fuhry aqui está um equivalente PowerShell que eu uso:
pip freeze | ? { $_ -notmatch ((gc req.txt) -join "|") }
fonte
Embora isso não responda diretamente à pergunta, uma alternativa melhor para
requirements.txt
agora é usar umPipfile
. Isso funciona de forma semelhante a um RubyGemfile
. Atualmente, você precisa fazer uso dapipenv
ferramenta, mas espero que ela seja eventualmente incorporadapip
. Isso fornece opipenv clean
comando que faz o que você deseja.(Observe que você pode importar um existente
requirements.txt
compipenv install -r requirements.txt
. Depois disso, você deve ter umPipfile
e orequirements.txt
pode ser removido.)fonte
Agora é possível usar:
fonte