Wie installiere ich ein Paket mit minimalem und maximalem Versionsbereich?

233

Ich frage mich, ob es eine Möglichkeit gibt, pip, insbesondere in einer Anforderungsdatei, anzuweisen, ein Paket mit einer minimalen Version ( pip install package>=0.2) und einer maximalen Version zu installieren, die niemals installiert werden sollten (theoretische API :) pip install package<0.3.

Ich frage, weil ich eine Drittanbieter-Bibliothek verwende, die sich in der aktiven Entwicklung befindet. Ich möchte, dass in meiner Pip-Anforderungsdatei angegeben wird, dass immer die neueste Nebenversion des 0.5.x-Zweigs installiert werden soll, aber ich möchte nicht, dass Pip seitdem versucht, neuere Hauptversionen (wie 0.6.x) zu installieren Die API ist anders. Dies ist wichtig, da die Entwickler, obwohl der Zweig 0.6.x verfügbar ist, immer noch Patches und Bugfixes für den Zweig 0.5.x veröffentlichen, sodass ich package==0.5.9in meiner Anforderungsdatei keine statische Zeile verwenden möchte .

Gibt es eine Möglichkeit, das zu tun?

coredumperror
quelle

Antworten:

301

Du kannst tun:

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

Und pipwird nach der besten Übereinstimmung suchen, vorausgesetzt, die Version ist mindestens 0,2 und weniger als 0,3.

Dies gilt auch für Pip- Anforderungsdateien . Ausführliche Informationen zu Versionsspezifizierern finden Sie in PEP 440 .

Hugo Tavares
quelle
Toter Link. Offizielle Dokumentation hier .
Beatgammit
45
Ich denke, es "package>=0.2,<=0.3"macht nicht viel Sinn: Wann wären Sie mit 0.2 und 0.3.0 einverstanden, aber nicht mit einer der Bugfix-Versionen von 0.3? Ich denke, dies "package>=0.2,<0.3"ist ein viel besseres Beispiel, da es den üblichen Fall widerspiegelt: "Bitte geben Sie mir die neueste Bugfix-Version der aktuellen Nebenversion, aber aktualisieren Sie mich nicht automatisch auf die nächste Nebenversion, da ich dies gerne tun würde." das explizit, um sicherzustellen, dass es keine funktionalen Änderungen gibt, die mich betreffen. "
Henrik Heimbuerger
Wenn Ihnen diese Antwort gefällt, werden Sie die Antwort von Mortiz unten lieben! ~=0.2Achten Sie darauf, es zu überprüfen, ist (imho) eine bessere Lösung als diese.
Brad Root
1
@BradRoot Es ist wirklich unklar, was ~=0.2.1zum Beispiel tun würde. Es >=0.2,<0.3ist gut, explizit zu sein , denn es ist wirklich klar, was passiert.
Acumenus
@Acumenus Jemand, der die Eigenschaften des Anforderungsformats und die Funktionsweise der Versionierung versteht, würde nicht ~=0.2.1in eine Anforderungsdatei schreiben . Das ist ein Benutzerfehler, kein Nachteil des ~=Präfixes.
Brad Root
86

Sie können auch verwenden:

pip install package==0.5.*

Das ist konsistenter und leicht zu lesen.

Lowrin
quelle
12
Dies ist eine viel bessere Möglichkeit, requirements.txtIMO zu verwalten . Die Verwendung von package==1.*anstelle von package>=1.2verhindert, dass pip die Hauptversion 2+ für das Paket installiert, was wünschenswert ist, da Änderungen der Hauptversion häufig abwärtskompatibel sind.
Michael Hays
10
Hinweis: Dadurch wird kein vorhandenes Paket aktualisiert. Beispiel: Wenn Sie 0.5.1 installiert haben, aber 0.5.2 auf dem neuesten Stand ist und Sie die Installation 0.5 ausführen. * wird "bereits zufrieden" angezeigt und Sie erhalten 0.5.1. Das Hinzufügen von --upgrade löst das Problem.
Scipilot
71

Eine elegante Methode wäre die Verwendung des ~=kompatiblen Release-Operators gemäß PEP 440 . In Ihrem Fall würde dies betragen:

package~=0.5.0

Wenn beispielsweise die folgenden Versionen vorhanden sind, wird Folgendes ausgewählt 0.5.9:

  • 0.5.0
  • 0.5.9
  • 0.6.0

Zur Verdeutlichung ist jedes Paar gleichwertig:

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

~= 0.5
>= 0.5, == 0.*
Moritz
quelle
Wie würden Sie dies für abgeschnittene Versionen verwenden? ZB wenn es eine 2.2und eine geplante Zukunft gibt 2.2.1, wird sie ~=2.2.*übereinstimmen, 2.2obwohl es keine Tertiärzahl gibt?
Mike 'Pomax' Kamermans
1
@ Mike'Pomax'Kamermans Sie sollten ~=2.2.0in diesem Fall verwenden ( *Operator funktioniert nicht, wenn Sie verwenden ~=). 2.2und 2.2.0(und 2.2.0.0usw.) werden intern bei der Installation von Paketen intern genauso behandelt.
Ik1ne
Es ist äußerst unklar, wie dies für die Nummerierung verschachtelter Versionen funktioniert, z ~=1.2.3. Es ist viel expliziter und klarer, stattdessen das Mehrklauselformular zu verwenden.
Acumenus
2
@MitchMcMabers Das funktioniert nur, wenn die gewünschten Funktionen in der ersten Version dieser Hauptversion vorhanden waren, was im Allgemeinen nicht der Fall ist. Wenn Sie sich auf etwas verlassen, das beispielsweise in Version 1.2.0 hinzugefügt wurde, == 1.*wird Version 1.1.0 nicht ordnungsgemäß akzeptiert. Der Operator ~=(oder das >=Plus, <wenn Sie das schwer zu lesen finden) ist besser, weil er die korrekte Spezifität fördert.
Maxpm
1
@ Maxpm Das ist ein guter Punkt. So == 1.*scheitern würde und nichts zu tun , wenn wir eine Version 1.2 Features , aber die Benutzer müssen bereits hatte 1.1 installiert. Ihr Vorschlag entspricht ~= 1.2dem Sprichwort >= 1.2, < 2.0(oder >= 1.2, == 1.*). Also ja, Sie haben Recht, ~=ist der beste Operator, da Sie damit auf die von Ihnen verwendete Entwicklungsversion einer Bibliothek abzielen und gleichzeitig neuere Versionen in derselben Hauptversion zulassen können. Danke für diese Klarstellung!
Mitch McMabers