Comment installer un paquet avec une plage de versions min et max?

233

Je me demande s'il existe un moyen de dire à pip, spécifiquement dans un fichier d'exigences, d'installer un package avec à la fois une version minimale ( pip install package>=0.2) et une version maximale qui ne devrait jamais être installée (api théorique:) pip install package<0.3.

Je demande parce que j'utilise une bibliothèque tierce qui est en développement actif. J'aimerais que mon fichier d'exigences pip spécifie qu'il doit toujours installer la version mineure la plus récente de la branche 0.5.x, mais je ne veux pas que pip essaie d'installer des versions majeures plus récentes (comme 0.6.x) depuis l'API est différente. Ceci est important car même si la branche 0.6.x est disponible, les développeurs publient toujours des correctifs et des corrections de bogues dans la branche 0.5.x, donc je ne veux pas utiliser de package==0.5.9ligne statique dans mon fichier d'exigences.

Y'a-t'il un quelconque moyen d'y arriver?

coredumperror
la source

Réponses:

301

Tu peux faire:

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

Et piprecherchera la meilleure correspondance, en supposant que la version est au moins 0,2 et inférieure à 0,3.

Cela s'applique également aux fichiers d'exigences pip . Voir les détails complets sur les spécificateurs de version dans PEP 440 .

Hugo Tavares
la source
Lien mort. Documentation officielle ici .
beatgammit
45
Pour mémoire, je pense que cela "package>=0.2,<=0.3"n'a pas beaucoup de sens: quand seriez-vous d'accord avec les versions 0.2 et 0.3.0, mais pas avec les versions de correction de bogues de 0.3? Je pense que "package>=0.2,<0.3"c'est un bien meilleur exemple, car il reflète le cas commun de dire: "veuillez me donner la dernière version de correction de bogue de la version mineure actuelle, mais ne me mettez pas automatiquement à niveau vers la prochaine version mineure, parce que j'aimerais faire cela explicitement, en veillant à ce qu'il n'y ait aucun changement fonctionnel qui m'affecte. "
Henrik Heimbuerger
Si vous aimez cette réponse, vous allez adorer la réponse de Mortiz juste en dessous! Assurez-vous de le vérifier, ~=0.2est (à mon humble avis) une meilleure solution que cela.
Brad Root
1
@BradRoot On ne sait vraiment pas ce que ~=0.2.1cela ferait, par exemple. Être explicite comme dans >=0.2,<0.3est une bonne chose car c'est vraiment clair ce qui se passe.
Acumenus
@Acumenus quelqu'un qui comprend les propriétés du format d'exigence et le fonctionnement du contrôle de version n'écrira pas ~=0.2.1dans un fichier d'exigences. C'est une erreur utilisateur, pas un inconvénient du ~=préfixe.
Brad Root
86

vous pouvez aussi utiliser:

pip install package==0.5.*

qui est plus cohérent et plus facile à lire.

lowrin
la source
12
C'est une bien meilleure façon de gérer l' requirements.txtOMI. Utiliser package==1.*au lieu de package>=1.2empêche pip d'installer la version majeure 2+ pour le package, ce qui est souhaitable car les changements de version majeurs sont souvent incompatibles en amont.
Michael Hays
10
Remarque, cela ne met pas à niveau un package existant. Par exemple, si vous avez installé 0.5.1, mais que 0.5.2 est le dernier, et que vous exécutez installer 0.5. * il indiquera "déjà satisfait" et vous laissera avec 0.5.1. L'ajout de --upgrade le résout.
scipilot
71

Une méthode élégante serait d'utiliser l' ~=opérateur de libération compatible selon PEP 440 . Dans votre cas, cela équivaudrait à:

package~=0.5.0

Par exemple, si les versions suivantes existent, il choisirait 0.5.9:

  • 0.5.0
  • 0.5.9
  • 0.6.0

Pour plus de précision, chaque paire est équivalente:

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

~= 0.5
>= 0.5, == 0.*
Moritz
la source
Comment utiliseriez-vous cela pour les versions tronquées? Par exemple, s'il y a un 2.2avenir planifié 2.2.1, cela ~=2.2.*correspondra même 2.2s'il n'y a pas de numéro tertiaire?
Mike 'Pomax' Kamermans
1
@ Mike'Pomax'Kamermans Vous devez utiliser ~=2.2.0dans ce cas (l' *opérateur ne fonctionnera pas si vous utilisez ~=). 2.2et 2.2.0(et 2.2.0.0, et ainsi de suite) sont gérés en interne comme la même chose lorsqu'il s'agit d'installer des packages.
ik1ne
Il est extrêmement difficile de savoir comment cela fonctionne pour la numérotation des versions imbriquées, par exemple ~=1.2.3. Il est beaucoup plus explicite et plus clair d'utiliser à la place le formulaire multi-clauses.
Acumenus du
2
@MitchMcMabers Cela ne fonctionne que si les fonctionnalités souhaitées se trouvent dans la première version de cette version majeure, ce qui n'est pas vrai en général. Si vous comptez sur quelque chose qui a été ajouté dans la v1.2.0, par exemple, == 1.*n'acceptera pas correctement la v1.1.0. L' opérateur ~=(ou >=plus <si vous trouvez cela difficile à lire) est meilleur car il encourage à être correctement spécifique.
Maxpm
1
@Maxpm C'est un bon point. Donc == 1.*, échouerait et ne ferait rien si nous avions besoin d'une fonctionnalité de version 1.2 mais que l'utilisateur avait déjà installé 1.1. Votre proposition ~= 1.2équivaut à dire >= 1.2, < 2.0(ou >= 1.2, == 1.*). Donc oui, vous avez raison, ~=c'est le meilleur opérateur car il vous permet de cibler la version de développement que vous avez utilisée d'une bibliothèque, tout en autorisant des versions plus récentes dans la même version principale. Merci pour cette clarification!
Mitch McMabers