Как установить пакет с минимальным и максимальным диапазоном версий?

233

Мне интересно, есть ли способ указать pip, в частности, в файле требований, установить пакет с минимальной версией ( pip install package>=0.2) и максимальной версией, которую никогда не следует устанавливать (теоретический api:) pip install package<0.3.

Я спрашиваю, потому что я использую стороннюю библиотеку, которая находится в активной разработке. Я хотел бы, чтобы в моем файле требований к pip всегда указывался последний вспомогательный выпуск ветки 0.5.x, но я не хочу, чтобы pip пытался установить какие-либо более новые основные версии (например, 0.6.x), так как API отличается. Это важно, потому что хотя ветка 0.6.x доступна, разработчики все еще выпускают исправления и исправления ошибок для ветки 0.5.x, поэтому я не хочу использовать статическую package==0.5.9строку в моем файле требований.

Есть ли способ сделать это?

coredumperror
источник

Ответы:

301

Ты можешь сделать:

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

И pipбудет искать лучшее совпадение, предполагая, что версия составляет не менее 0,2 и менее 0,3.

Это также относится к файлам требований к пунктам . См. Полную информацию о спецификаторах версий в PEP 440 .

Уго Таварес
источник
Мертвая ссылка. Официальная документация здесь .
beatgammit
45
Для справки, я думаю "package>=0.2,<=0.3", не имеет особого смысла: когда вы будете в порядке с 0.2 и 0.3.0, но не с какими-либо выпусками исправлений ошибок 0.3? Я думаю, что "package>=0.2,<0.3"это гораздо лучший пример, потому что он отражает распространенный случай: «Пожалуйста, дайте мне последний выпуск исправлений текущей минорной версии, но не обновляйте меня автоматически до следующей минорной версии, потому что я хотел бы сделать это явно, убедившись, что нет никаких функциональных изменений, влияющих на меня. "
Хенрик Хаймбюргер
Если вам нравится этот ответ, вам понравится ответ Мортиза прямо внизу! Не забудьте проверить это, ~=0.2(imho) лучшее решение, чем это.
Брэд Рут
1
@BradRoot Действительно неясно, что ~=0.2.1будет делать, например. Быть явным, как в >=0.2,<0.3, это хорошая вещь, потому что действительно ясно, что происходит.
Acumenus
@ Acumenus кто-то, кто понимает свойства формата требований и как работает управление версиями, не запишет ~=0.2.1в файл требований. Это ошибка пользователя, а не недостаток ~=префикса.
Брэд Рут
86

Вы также можете использовать:

pip install package==0.5.*

который является более последовательным и легко читаемым.

lowrin
источник
12
Это гораздо лучший способ управления requirements.txtИМО. Использование package==1.*вместо package>=1.2препятствует установке pip основной версии 2+ для пакета, что является желательным, поскольку изменения в основной версии часто обратно несовместимы.
Майкл Хейс
10
Обратите внимание, это не обновляет существующий пакет. Например, если у вас установлено 0.5.1, но самое последнее - 0.5.2, и вы запустили установку 0.5. *, он скажет «уже удовлетворен» и оставит вас с 0.5.1. Добавление --upgrade решает это.
scipilot
71

Элегантным способом было бы использовать ~=совместимый оператор освобождения в соответствии с PEP 440 . В вашем случае это составит:

package~=0.5.0

Например, если существуют следующие версии, он выберет 0.5.9:

  • 0.5.0
  • 0.5.9
  • 0.6.0

Для пояснения каждая пара эквивалентна:

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

~= 0.5
>= 0.5, == 0.*
Moritz
источник
Как бы вы использовали это для усеченных версий? Например, если есть 2.2и запланированное будущее 2.2.1, будет ли ~=2.2.*совпадать, 2.2несмотря на отсутствие третичного числа?
Майк 'Pomax' Камерманс
1
@ Mike'Pomax'Kamermans Вы должны использовать ~=2.2.0в этом случае ( *оператор не будет работать, если вы используете ~=). 2.2и 2.2.02.2.0.0так далее) внутренне обрабатываются как одна и та же вещь, когда дело доходит до установки пакетов.
ik1ne
Крайне непонятно, как это работает для нумерации вложенных версий, например ~=1.2.3. Вместо этого гораздо яснее и понятнее использовать форму с несколькими предложениями.
Acumenus
2
@MitchMcMabers Это работает только в том случае, если нужные вам функции присутствовали в первом выпуске этой основной версии, что в общем случае неверно. Если вы полагаетесь на то, что было добавлено в v1.2.0, например, == 1.*неправильно примет v1.1.0. Оператор ~=(или >=плюс, <если вам трудно это читать) лучше, потому что он поощряет быть точным.
Макс. Вечера
1
@Maxpm Это хороший момент. Так == 1.*что не получится и ничего не будет делать, если нам понадобится функция версии 1.2, но у пользователя уже установлена ​​версия 1.1. Ваш предложенный ~= 1.2- то же самое, что сказать >= 1.2, < 2.0(или >= 1.2, == 1.*). Так что да, вы правы, ~=это лучший оператор, так как он позволяет вам ориентироваться на версию разработки, которую вы использовали для библиотеки, и в то же время разрешать более новые версии в той же основной версии. Спасибо за это разъяснение!
Митч МакМаберс