Jak pip zainstalować pakiet z minimalnym i maksymalnym zakresem wersji?

233

Zastanawiam się, czy jest jakiś sposób, aby powiedzieć pipowi, szczególnie w pliku wymagań, aby zainstalował pakiet z wersją minimalną ( pip install package>=0.2) i maksymalną, której nigdy nie należy instalować (teoretyczne API:) pip install package<0.3.

Pytam, ponieważ korzystam z biblioteki innej firmy, która jest aktywnie rozwijana. Chciałbym, aby mój plik wymagań pip określał, że powinien on zawsze instalować najnowszą mniejszą wersję oddziału 0.5.x, ale nie chcę, aby pip kiedykolwiek próbował instalować nowsze wersje główne (jak 0.6.x) interfejs API jest inny. Jest to ważne, ponieważ chociaż gałąź 0.6.x jest dostępna, deweloperzy nadal udostępniają łatki i poprawki do gałęzi 0.5.x, więc nie chcę używać package==0.5.9linii statycznej w pliku wymagań.

Czy istnieje jakiś sposób, aby to zrobić?

Coredumperror
źródło

Odpowiedzi:

301

Możesz to zrobić:

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

I pipbędzie szukać najlepszego dopasowania, zakładając, że wersja ma co najmniej 0,2, a mniej niż 0,3.

Dotyczy to również plików wymagań pip . Zobacz pełne szczegóły na temat specyfikatorów wersji w PEP 440 .

Hugo Tavares
źródło
Martwy link. Oficjalna dokumentacja tutaj .
beatgammit
45
Dla przypomnienia, myślę, że "package>=0.2,<=0.3"nie ma to większego sensu: kiedy miałbyś rację zarówno z 0.2 jak i 0.3.0, ale nie z żadną z wydanych poprawek 0.3? Myślę, że "package>=0.2,<0.3"jest to znacznie lepszy przykład, ponieważ odzwierciedla częsty przypadek powiedzenia: „proszę o podanie najnowszej wersji poprawki bieżącej wersji dodatkowej, ale nie uaktualniaj mnie automatycznie do następnej wersji dodatkowej, ponieważ chciałbym to zrobić wyraźnie, upewniając się, że nie dotyczą mnie żadne zmiany funkcjonalne ”.
Henrik Heimbuerger
Jeśli podoba ci się ta odpowiedź, spodoba ci się odpowiedź Mortiz poniżej! Pamiętaj, aby to sprawdzić, ~=0.2jest (imho) lepszym rozwiązaniem niż to.
Brad Root
1
@BradRoot Na przykład nie jest jasne, co ~=0.2.1by się stało . >=0.2,<0.3Dobrze jest być wyraźnie wyrażonym, ponieważ jest jasne, co się dzieje.
Acumenus,
@Acumenus ktoś, kto rozumie właściwości formatu wymagań i sposób działania wersji, nie zapisałby ~=0.2.1w pliku wymagań. To błąd użytkownika, a nie wada ~=prefiksu.
Brad Root
86

możesz także użyć:

pip install package==0.5.*

który jest bardziej spójny i łatwy do odczytania.

lowrin
źródło
12
Jest to znacznie lepszy sposób zarządzania requirements.txtIMO. Użycie package==1.*zamiast package>=1.2uniemożliwia pipowi instalację głównej wersji 2+ dla pakietu, co jest pożądane, ponieważ zmiany głównych wersji są często niezgodne wstecz.
Michael Hays
10
Uwaga: To nie aktualizuje istniejącego pakietu. np. jeśli masz zainstalowaną wersję 0.5.1, ale wersja 0.5.2 jest najnowsza i uruchomisz instalację wersji 0.5. * powiesz „już zadowolony” i pozostawisz wersję 0.5.1. Dodanie --upgrade rozwiązuje to.
scipilot
71

Elegancką metodą byłoby użycie ~=zgodnego operatora zwalniającego zgodnie z PEP 440 . W twoim przypadku oznaczałoby to:

package~=0.5.0

Na przykład, jeśli istnieją następujące wersje, wybrałby 0.5.9:

  • 0.5.0
  • 0.5.9
  • 0.6.0

Dla wyjaśnienia, każda para jest równoważna:

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

~= 0.5
>= 0.5, == 0.*
Moritz
źródło
Jak byś tego użył do skróconych wersji? Np. Jeśli istnieje 2.2planowana przyszłość 2.2.1, czy ~=2.2.*pasuje, 2.2mimo że nie ma trzeciego numeru?
Mike 'Pomax' Kamermans
1
@ Mike'Pomax'Kamermans Powinieneś użyć ~=2.2.0w takim przypadku ( *operator nie będzie działać, jeśli używasz ~=). 2.2i 2.2.0(i 2.2.0.0tak dalej) są wewnętrznie traktowane tak samo, jeśli chodzi o instalowanie pakietów.
ik1ne
Niezwykle niejasne jest, jak to działa w przypadku zagnieżdżonej numeracji wersji, np ~=1.2.3. Zamiast tego korzystanie z formularza złożonego z wielu klauzul jest o wiele bardziej wyraźne i jaśniejsze.
Acumenus,
2
@MitchMcMabers Działa to tylko wtedy, gdy żądane funkcje były obecne w pierwszym wydaniu tej głównej wersji, co ogólnie nie jest prawdą. Jeśli polegasz na czymś, co zostało dodane w wersji 1.2.0, na przykład == 1.*nieprawidłowo zaakceptuje wersję 1.1.0. Operator ~=(lub >=plus, <jeśli uważasz, że jest to trudne do odczytania) jest lepszy, ponieważ zachęca do bycia poprawnie określonym.
Maks.
1
@Maxpm To dobra uwaga. Nie == 1.*powiodłoby się i nic nie zrobiłoby, gdybyśmy potrzebowali funkcji wersji 1.2, ale użytkownik miał już zainstalowany 1.1. Twoja propozycja ~= 1.2jest taka sama jak powiedzenie >= 1.2, < 2.0(lub >= 1.2, == 1.*). Więc tak, masz rację, ~=jest najlepszym operatorem, ponieważ pozwala ci kierować wersję programistyczną, której używałeś biblioteki, jednocześnie pozwalając na nowsze wersje w tej samej głównej wersji. Dzięki za wyjaśnienie!
Mitch McMabers