Atualize os pacotes do Python de requirements.txt usando o comando pip


113

Como faço para atualizar todos os meus pacotes Python do arquivo requirements.txt usando o comando pip?

tentei com o comando abaixo

$ pip install --upgrade -r requirements.txt

Desde então, os pacotes python são sufixados com o número da versão ( Django==1.5.1), eles não parecem atualizar. Existe alguma abordagem melhor do que editar manualmente o arquivo requirements.txt?

EDITAR

Como Andy mencionou em sua resposta, os pacotes são fixados em uma versão específica, portanto, não é possível atualizar os pacotes por meio do comando pip.

Mas podemos conseguir isso pip-toolsusando o seguinte comando.

$ pip-review --auto

isso irá atualizar automaticamente todos os pacotes de requirements.txt (certifique-se de instalar pip-toolsusando o comando pip install).


7
Pip-tools está funcionando muito bem - sintaxe atualizada está pip-compile -U requirements.txt.
erikreed

Respostas:


40

Não. Seu arquivo de requisitos foi fixado em versões específicas. Se seus requisitos forem definidos para essa versão, você não deve tentar atualizar além dessas versões. Se você precisar fazer upgrade, deverá alternar para versões não fixadas em seu arquivo de requisitos.

Exemplo:

lxml>=2.2.0

Isso atualizaria o lxml para qualquer versão mais recente que 2.2.0

lxml>=2.2.0,<2.3.0

Isso atualizaria o lxml para a versão mais recente entre 2.2.0 e 2.3.0.


2
Achei útil fazer o seguinte. 1. Excluído venv 2. Criado um novo com o mesmo nome (a maneira de limpar todos os pacotes pip) 3. Substitua todos == para> = no requirements.txt 4. pip install -r requirements.txt 4.
zhukovgreen

sed 's/==/>=/g' requirements.txt > TMP_FILE && mv TMP_FILE requirements.txt substituirá todos ==por>=
philshem

80

podes tentar:

pip install --upgrade --force-reinstall -r requirements.txt

Você também pode ignorar o pacote instalado e instalar o novo:

pip install --ignore-installed -r requirements.txt

2
com essa opção, parece reinstalar a mesma versão. Como Andy mencionou na resposta acima, os pacotes são fixados em uma versão específica.
abhiomkar

@abhiomkar, você está certo Achei que você queria reinstalar a mesma versão (talvez para adicionar correção de backport)
Freelancer

1
O segundo comando é o que eu estava procurando. Observe que -Ie --ignore-installedsão os mesmos sinalizadores e, claro, não é válido ter um ,lá. Desta forma, não ocorrerão downgrades durante a instalação e após a conclusão da instalação dos requisitos, pode-se atualizar os pacotes instalados usando pip-review --auto.
AXO

79

Eu já respondi a essa pergunta aqui . Esta é minha solução:

Como não havia uma maneira fácil de atualizar pacote por pacote e atualizar o arquivo requirements.txt, escrevi este pip-upgradeer que também atualiza as versões em seu requirements.txtarquivo para os pacotes escolhidos (ou todos os pacotes).

Instalação

pip install pip-upgrader

Uso

Ative seu virtualenv (importante, porque ele também instalará as novas versões de pacotes atualizados no virtualenv atual).

cd no diretório do projeto e, em seguida, execute:

pip-upgrade

Uso avançado

Se os requisitos forem colocados em um local não padrão, envie-os como argumentos:

pip-upgrade path/to/requirements.txt

Se você já sabe qual pacote deseja atualizar, basta enviá-los como argumentos:

pip-upgrade -p django -p celery -p dateutil

Se você precisar atualizar para a versão de pré-lançamento / pós-lançamento, adicione um --prereleaseargumento ao seu comando.

Divulgação completa: eu escrevi este pacote.


5
Ótimo! É surpreendente que tal função não esteja presente diretamente no pip
Jacopofar

5
Elegante! Super feliz por ter rolado para baixo para isto: P
PulseJet

3
Acabei de usar isso e é a melhor coisa desde cordas-f.
Pierre.Sassoulas

1
Ótima ferramenta. Obrigado.
mszaro

Ferramenta muito útil! Eu também encontrei outro pacote chamado pur que atualiza as versões fixadas
Gal Avineri

4

Eu sugiro congelar todas as suas dependências para ter compilações previsíveis .

Ao fazer isso, você pode atualizar todas as dependências de uma vez, desta forma:

sed -i '' 's/==/>=/g' requirements.txt
pip install -U -r requirements.txt
pip freeze > requirements.txt

Tendo feito o exposto, testar seu projeto com o novo conjunto de pacotes e, eventualmente, comprometer o requirements.txtarquivo para o repositório.


3

Eu apenas tive que fazer o mesmo ... usei esta pequena linha para fazer o trabalho:

packages=$(cat requirements.txt | sed 's/==.*//g'); echo $packages | xargs pip3 install -U; freeze=$(pip3 freeze); for p in $(echo $packages); do echo $freeze | grep -E "^${p}==" >> requirements.new; done

qual:

  • packages=$(cat requirements.txt | sed 's/==.*//g') cria uma lista dos nomes dos pacotes atuais em requirements.txt (removendo a versão).
  • echo $packages | xargs pip3 install -U em seguida, passa todos os pacotes como argumentos para o pip3 atualizar.
  • freeze=$(pip3 freeze); Obtém todas as versões atuais do pacote no formato exigido para requirements.txt
  • for p in $(echo $packages) então itera através dos nomes dos pacotes
    • echo $freeze | grep -E "^${p}==" >> requirements.new obtém a linha de versão do pacote da saída de congelamento do pip que corresponde ao pacote e grava em novo requirements.txt

Isso tem o benefício adicional de preservar a ordem do requirements.txt original. :)

Espero que isto ajude!


2

Como não poderia fazer isso usando o bash, escrevi um módulo Python para criar um novo arquivo de requisitos sem versões e usá-lo:

data = open('requirements-prod.pip', 'r')
data2 = open('requirements-prod-no-version.pip', 'w')
for line in data.readlines():
    new_line = line[:line.index('==')]
    data2.write(new_line + '\n')
data2.flush()

Em seguida, instale as libs do novo arquivo pip install -U -r requirements-prod-no-version.pip

Finalmente congele as versões para o arquivo original pip freeze > requirements-prod.pip


2

Outra solução é usar o pacote de requisitos de atualização

pip install upgrade-requirements

E então execute:

upgrade-requirements

Ele atualizará todos os pacotes que não estão em suas versões mais recentes e também criará um requirements.txt atualizado no final.


0
  • 1) Para atualizar os arquivos instalados pelo pip a partir de reqs.txt, adicione o > = no lugar de ==. Isso dirá ao pip para instalar o lib maior ou igual à versão que você está solicitando, aqui instalando a versão mais atualizada da biblioteca solicitada

    1.a) ** Minha resposta para o tópico ** Adicionando py -m pip install -r reqs.txt para uma reinicialização diária ... ou algo dessa natureza, você pode atualizar suas bibliotecas instaladas. Resumido por Andy Perfeitamente

    -Minha razão para entrar neste tópico foi para encontrar informações sobre como atualizar o pip base do env virtual (geralmente 10.0.03 para mim ??)

na esperança de satisfazer um problema do qual consegui derivar uma de duas soluções

A. criação de venv || B. Instalação de bibliotecas necessárias

Graças a Andy, atendi a necessidade B

Adicionando pip > = versão solicitada em reqs.txt

após a instanciação do novo ambiente virtual || re-instanciação do Venv anterior

  1. py -m venv devenv

configurar um novo dev env

  1. devenv\scripts\activate.bat

para ativar dev env

  1. python -m pip install -r requirenments.txt

instalar libs base

produção de safras

Coletando pip > = 20.0.2 (de -r requirenments.txt (linha 1)) Usando em cache> https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip2.py2.py3-py3 nenhum-nenhum.whl

Instalação existente encontrada: pip 10.0.1

Desinstalando pip-10.0.1:

 Successfully uninstalled pip-10.0.1
 Successfully installed pip-20.0.2

Desculpe pelo despejo de cérebro, espero que isso ajude alguém :)

🤳 Austin 👨‍🎤🚀🥊


0

A segunda resposta é a mais útil, mas o que eu queria fazer é bloquear alguns pacotes enquanto tenho outros na versão mais recente (por exemplo, youtube-dl).

Um exemplo requirements.txtficaria assim (~ significa compatível):

Pillow==6.2.2
requests~=2.22.0
youtube_dl

Então, no terminal, use o comando pip install --upgrade -r requirements.txt

Isso garante que o Pillow permanecerá em 6.2.2, as solicitações serão atualizadas para a versão 2.22.x mais recente (se disponível) e a versão mais recente do youtube-dl será instalada, se ainda não estiver instalada.


0

Acho que a solução mais simples é criar o requirements.txt com:

pip freeze | sed 's/==/>=/' > requirements.txt

-1

Se você instalar qualquer coisa em seu projeto django e após a instalação quiser atualizar seu arquivo de requisitos, este comando pode atualizar seu arquivo required.txt pip freeze> requirements.txt

se o seu arquivo de requisitos não existir em seu projeto, você pode usar este comando para criar novo arquivo de requisitos.txt pip freeze> requisitos.txt


esta é uma má ideia porque também adicionará os requisitos de todos os seus requisitos, resultando em um arquivo de requisitos desnecessariamente grande. Se você decidir atualizar uma única dependência, provavelmente terá conflitos de versão, a menos que saiba quais outros requisitos foram incluídos em seu arquivo de requisitos por causa desse pacote.
tumultuado em

-10

Eu edito o requirements.txt conforme abaixo e executo $ sh ./requirements.txt

pip install -U amqp;
pip install -U appdirs;
pip install -U arrow;
pip install -U Babel;
pip install -U billiard;
pip install -U celery;
pip install -U Django;
pip install -U django-cors-headers;
pip install -U django-crispy-forms;
pip install -U django-filter;
pip install -U django-markdown-deux;
pip install -U django-pagedown;
pip install -U django-timezone-field;
pip install -U djangorestframework;
pip install -U fcm-django;
pip install -U flower;
pip install -U gunicorn;
pip install -U kombu;
pip install -U Markdown;
pip install -U markdown2;
pip install -U packaging;

3
Este é o exemplo ideal de antipadrão. O que há de errado aqui: 1) O requirements.txt é um arquivo .txt, mas você o tornou executável 2). Há um comando pip install -r requirements.txt simples. Portanto, você pode usar o arquivo requirements.txt apenas para listar as dependências do projeto. 3) Você não está usando versões dos pacotes. 4) Não é um padrão comum, outros desenvolvedores não fazem nada sobre como usá-lo. 5) Difícil de usar com pipelines CI / CD. Não use este exemplo
Fannigurt
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.