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


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.0(і 2.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.