Come installare un pacchetto con un intervallo minimo e massimo di versioni?


233

Mi chiedo se c'è un modo per dire a pip, in particolare in un file di requisiti, di installare un pacchetto con una versione minima ( pip install package>=0.2) e una versione massima che non dovrebbe mai essere installata (api teorico:) pip install package<0.3.

Lo chiedo perché sto utilizzando una libreria di terze parti in fase di sviluppo attivo. Vorrei che il mio file dei requisiti di pip specificasse che doveva sempre installare la versione minore più recente del ramo 0.5.x, ma non voglio che pip provi mai a installare le versioni principali più recenti (come 0.6.x) da quando l'API è diversa. Questo è importante perché anche se il ramo 0.6.x è disponibile, gli sviluppatori stanno ancora rilasciando patch e correzioni di bug nel ramo 0.5.x, quindi non voglio usare una package==0.5.9linea statica nel mio file dei requisiti.

C'è un modo per farlo?

Risposte:


301

Tu puoi fare:

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

E pipcercherà la migliore corrispondenza, supponendo che la versione sia almeno 0,2 e inferiore a 0,3.

Questo vale anche per i file dei requisiti di pip . Vedi i dettagli completi sugli identificatori di versione in PEP 440 .


Collegamento morto. Documentazione ufficiale qui .
Beatgammit,

45
Per la cronaca, penso che "package>=0.2,<=0.3"non abbia molto senso: quando staresti bene con entrambe le versioni 0.2 e 0.3.0, ma non con nessuna delle versioni di bugfix di 0.3? Penso che "package>=0.2,<0.3"sia un esempio molto migliore, perché riflette il caso comune di dire: "per favore dammi l'ultima versione di bugfix della versione minore corrente, ma non aggiornarmi automaticamente alla prossima versione minore, perché mi piacerebbe fare che esplicitamente, assicurandomi che non ci siano cambiamenti funzionali che mi riguardano ".
Henrik Heimbuerger,

Se ti piace questa risposta, adorerai la risposta di Mortiz in basso! Assicurati di ~=0.2provarlo , è (imho) una soluzione migliore di questa.
Brad Root,

1
@BradRoot Ad esempio, non è chiaro cosa ~=0.2.1farebbe. Essere espliciti come in >=0.2,<0.3è una buona cosa perché è davvero chiaro cosa sta succedendo.
Acumenus,

@Acumenus qualcuno che capisce le proprietà del formato dei requisiti e come funziona il controllo delle versioni non scriverebbe ~=0.2.1in un file dei requisiti. Questo è un errore dell'utente, non uno svantaggio del ~=prefisso.
Brad Root

86

puoi anche usare:

pip install package==0.5.*

che è più coerente e di facile lettura.


12
Questo è un modo molto migliore per gestire l' requirements.txtIMO. L'uso package==1.*invece di package>=1.2impedisce a pip di installare la versione principale 2+ per il pacchetto, il che è auspicabile poiché le modifiche alla versione principale sono spesso incompatibili all'indietro.
Michael Hays, il

10
Nota, questo non aggiorna un pacchetto esistente. ad es. se hai installato 0.5.1, ma 0.5.2 è l'ultimo ed esegui l'installazione 0.5. * ti dirà "già soddisfatto" e ti lascerà con 0.5.1. L'aggiunta di --upgrade lo risolve.
scipilot,

71

Un metodo elegante sarebbe quello di utilizzare l' ~=operatore di rilascio compatibile secondo PEP 440 . Nel tuo caso ciò equivarrebbe a:

package~=0.5.0

Ad esempio, se esistono le seguenti versioni, sceglierebbe 0.5.9:

  • 0.5.0
  • 0.5.9
  • 0.6.0

Per chiarimenti, ogni coppia è equivalente:

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

~= 0.5
>= 0.5, == 0.*

Come lo useresti per le versioni troncate? Ad esempio, se c'è un 2.2e un futuro pianificato 2.2.1, ~=2.2.*corrisponderà 2.2nonostante non ci sia un numero terziario?
Mike 'Pomax' Kamermans,

1
@ Mike'Pomax'Kamermans Dovresti usare ~=2.2.0in quel caso (l' *operatore non funzionerà se stai usando ~=). 2.2e 2.2.0(e 2.2.0.0così via) sono gestiti internamente come la stessa cosa quando si tratta di installare pacchetti.
ik1ne,

Non è molto chiaro come funzioni per la numerazione delle versioni nidificate, ad es ~=1.2.3. È invece molto più esplicito e chiaro utilizzare il modulo multi-clausola.
Acumenus,

2
@MitchMcMabers Funziona solo se le funzionalità desiderate sono state presenti nella prima versione di quella versione principale, il che non è vero in generale. Se stai facendo affidamento su qualcosa che è stato aggiunto nella v1.2.0, ad esempio, == 1.*accetterà erroneamente la v1.1.0. L' operatore ~=(o >=più <se lo trovi difficile da leggere) è migliore perché incoraggia ad essere correttamente specifico.
Max

1
@Maxpm Questo è un buon punto. Quindi == 1.*fallirebbe e non farebbe nulla se avessimo bisogno di una funzionalità della versione 1.2 ma l'utente avesse già installato 1.1. La tua proposta ~= 1.2equivale a dire >= 1.2, < 2.0(o >= 1.2, == 1.*). Quindi sì, hai ragione, ~=è il miglior operatore in quanto ti consente di scegliere come target la versione di sviluppo che hai utilizzato di una libreria, consentendo allo stesso tempo versioni più recenti all'interno della stessa versione principale. Grazie per quel chiarimento!
Mitch McMabers,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.