Como instalar um pacote com as versões mínima e máxima?

233

Gostaria de saber se há alguma maneira de dizer ao pip, especificamente em um arquivo de requisitos, para instalar um pacote com uma versão mínima ( pip install package>=0.2) e uma versão máxima que nunca deve ser instalada (API teórica:) pip install package<0.3.

Eu pergunto porque estou usando uma biblioteca de terceiros que está em desenvolvimento ativo. Gostaria que meu arquivo de requisitos de pip especifique que ele deve sempre instalar a versão menor mais recente da ramificação 0.5.x, mas não quero que o pip tente instalar quaisquer versões principais mais recentes (como 0.6.x) desde a API é diferente. Isso é importante porque, embora o ramo 0.6.x esteja disponível, os desenvolvedores ainda estão lançando patches e correções no ramo 0.5.x, portanto, não quero usar uma package==0.5.9linha estática no meu arquivo de requisitos.

Existe alguma maneira de fazer isso?

coredumperror
fonte

Respostas:

301

Você pode fazer:

$ pip install "package>=0.2,<0.3"

E pipprocurará a melhor correspondência, supondo que a versão seja pelo menos 0,2 e menor que 0,3.

Isso também se aplica aos arquivos de requisitos de pip . Veja os detalhes completos sobre os especificadores de versão no PEP 440 .

Hugo Tavares
fonte
Link morto. Documentação oficial aqui .
Beatgammit 4/14/14
45
Para o registro, acho "package>=0.2,<=0.3"que não faz muito sentido: quando você ficaria bem com o 0.2 e o 0.3.0, mas não com os lançamentos de correções do 0.3? Eu acho que "package>=0.2,<0.3"é um exemplo muito melhor, porque reflete o caso comum de dizer: "por favor, me dê a última versão de correção de bug da versão menor atual, mas não me atualize automaticamente para a próxima versão menor, porque eu gostaria de fazer isso explicitamente, certificando-se de que não haja alterações funcionais que me afetem ".
Henrik Heimbuerger
Se você gostou desta resposta, vai adorar a resposta da Mortiz logo abaixo! Não deixe de conferir, ~=0.2é (imho) uma solução melhor que essa.
Brad Root
1
@BradRoot Não está realmente claro o ~=0.2.1que faria, por exemplo. Ser explícito como em >=0.2,<0.3é uma coisa boa, porque é realmente claro o que está acontecendo.
Acumenus 01/11/19
@Acumenus alguém que entenda as propriedades do formato do requisito e como funciona o controle de versão não gravará ~=0.2.1em um arquivo de requisitos. Isso é erro do usuário, não uma desvantagem do ~=prefixo.
Brad Root
86

você também pode usar:

pip install package==0.5.*

que é mais consistente e fácil de ler.

lowrin
fonte
12
Essa é uma maneira muito melhor de gerenciar o requirements.txtIMO. O uso em package==1.*vez de package>=1.2impedir o pip de instalar a versão principal 2+ para o pacote, o que é desejável, pois as principais alterações na versão geralmente são incompatíveis com versões anteriores.
Michael Hays
10
Observe que isso não atualiza um pacote existente. por exemplo, se você possui o 0.5.1 instalado, mas o 0.5.2 é o mais recente, e você executa o install 0.5. * ele diz "já satisfeito" e o deixa com o 0.5.1. A adição de --upgrade resolve.
Scipilot
71

Um método elegante seria usar o ~=operador de liberação compatível de acordo com a PEP 440 . No seu caso, isso equivaleria a:

package~=0.5.0

Como exemplo, se as seguintes versões existirem, ele escolheria 0.5.9:

  • 0.5.0
  • 0.5.9
  • 0.6.0

Para esclarecimento, cada par é equivalente:

~= 0.5.0
>= 0.5.0, == 0.5.*

~= 0.5
>= 0.5, == 0.*
Moritz
fonte
Como você usaria isso para versões truncadas? Por exemplo, se houver um 2.2futuro e um planejado 2.2.1, será ~=2.2.*compatível, 2.2apesar de não haver um número terciário?
Mike 'Pomax' Kamermans
1
@ Mike'Pomax'Kamermans Você deve usar ~=2.2.0nesse caso (o *operador não funcionará se você estiver usando ~=). 2.2e 2.2.0(e 2.2.0.0assim por diante) são tratados internamente como a mesma coisa quando se trata de instalar pacotes.
Ik1ne 23/05/19
Não é muito claro como isso funciona para a numeração de versões aninhadas, por exemplo ~=1.2.3. É muito mais explícito e claro usar o formulário com várias cláusulas.
Acumenus 01/11/19
2
@MitchMcMabers Isso só funciona se os recursos que você deseja estiverem presentes no primeiro lançamento dessa versão principal, o que geralmente não é verdade. Se você confiar em algo que foi adicionado na v1.2.0, por exemplo, == 1.*aceitará incorretamente a v1.1.0. O operador ~=(ou >=mais, <se você acha difícil ler) é melhor porque incentiva a ser corretamente específico.
Maxpm 15/02
1
@ Maxpm Esse é um bom ponto. Portanto == 1.*, falharia e não faria nada se precisarmos de um recurso da versão 1.2, mas o usuário já tivesse o 1.1 instalado. Sua proposta ~= 1.2é o mesmo que dizer >= 1.2, < 2.0(ou >= 1.2, == 1.*). Então, sim, você está certo, ~=é o melhor operador, pois permite direcionar a versão de desenvolvimento que você usou de uma biblioteca, enquanto permite versões mais novas na mesma versão principal. Obrigado por esse esclarecimento!
Mitch McMabers 17/02