Як встановити пакет з мінімальним та максимальним діапазоном версій?


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рядок у файлі моїх вимог.

Чи можна це зробити?

Відповіді:


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чи (імхо) краще рішення, ніж це.
Бред Корінь

1
@BradRoot Насправді незрозуміло, що ~=0.2.1б робити, наприклад. Бути явним, як у >=0.2,<0.3, це добре, тому що дійсно зрозуміло, що відбувається.
Acumenus

@Acumenus той, хто розуміє властивості формату вимог і як працює версія, не записує ~=0.2.1у файл вимог. Це помилка користувача, а не недолік ~=префікса.
Бред Корінь

86

Ви також можете використовувати:

pip install package==0.5.*

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


12
Це набагато кращий спосіб управління requirements.txtІМО. Використання package==1.*замість того, package>=1.2щоб pip не встановлював для пакета основну версію 2+, що бажано, оскільки основні зміни версій часто несумісні.
Майкл Хейс

10
Примітка. Це не покращує існуючий пакет. Наприклад, якщо у вас встановлено 0.5.1, але найновіший 0.5.2, і ви запустите встановити 0.5., він скаже "вже задоволений" і залишить вас з 0.5.1. Додавання - оновлення вирішує це.
науковець

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.*

Як би ви використовували це для усічених версій? Наприклад, якщо є 2.2і заплановане майбутнє 2.2.1, ~=2.2.*збігатиметься, 2.2незважаючи на те, що не є третинним числом?
Майк 'Помакс' Камерманс

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. Оператор ~=(або >=плюс, <якщо вам здається, що важко читати), оператор кращий, оскільки він заохочує бути правильним.
Maxpm

1
@Maxpm Це хороший момент. Так == 1.*що не вдасться і нічого не робити, якщо нам потрібна функція версії 1.2, але у користувача вже було встановлено 1.1. Пропоноване вами ~= 1.2те саме, що сказати >= 1.2, < 2.0(або >= 1.2, == 1.*). Так, ви маєте рацію, ~=є найкращим оператором, оскільки він дозволяє орієнтуватися на розробну версію, яку ви використовували, а також дозволяти новіші версії в межах тієї самої основної версії. Дякую за пояснення!
Мітч Макмаберс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.