Коли використовувати файл вимог pip проти install_requires у setup.py?


94

Я використовую pip з virtualenv для пакування та встановлення деяких бібліотек Python.

Я думаю, те, що я роблю, є досить поширеним сценарієм. Я є супровідником декількох бібліотек, для яких я можу чітко вказати залежності. Деякі мої бібліотеки залежать від сторонніх бібліотек, які мають транзитивні залежності, над якими я не маю контролю.

Я намагаюся домогтися того, щоб pip installодна з моїх бібліотек завантажила / встановила всі її залежності вище за течією. Я борюся з документацією pip, це якщо / як файли вимог можуть це зробити самостійно або якщо вони насправді є лише доповненням до використання install_requires.

Чи використовував би я install_requiresу всіх своїх бібліотеках вказати залежності та діапазони версій, а потім використовувати лише файл вимог, щоб вирішити конфлікт та / або заморозити їх для виробничої збірки?

Давайте зробимо вигляд, що я живу в уявному світі (я знаю, я знаю), і мої залежності вище за течією прямолінійні і гарантовано ніколи не конфліктують і не порушують зворотну сумісність. Чи змушений би я взагалі використовувати файл вимог pip, або просто дозволити pip / setuptools / distribute встановити все, що базується install_requires?

Тут є багато подібних запитань, але я не міг знайти таких, що були б такими основними, як коли використовувати той чи інший або гармонічно використовувати їх обидва.


3
Це дуже приємна стаття, яка пояснює стосунки двох, а також те, як вони інтегруються.
Björn Pollex

Відповіді:


68

Моя філософія полягає в тому, що він install_requiresповинен вказувати мінімум того, що вам потрібно. Він може включати вимоги до версії, якщо ви знаєте, що деякі версії не будуть працювати; але він не повинен мати вимог до версії там, де ви не впевнені (наприклад, ви не впевнені, чи майбутній випуск залежності зламає вашу бібліотеку чи ні).

Файли вимог, з іншого боку, повинні вказувати, що ви знаєте , працює, і можуть включати додаткові залежності, які ви рекомендуєте. Наприклад, ви можете використовувати SQLAlchemy, але запропонувати MySQL, і тому розмістіть MySQLdb у файлі вимог).

Отже, підсумовуючи: install_requiresце тримати людей подалі від речей, які, як ви знаєте, не працюють, тоді як файли вимог спрямовують людей до того, що, як ви знаєте, працює. Однією з причин цього є те, що install_requiresвимоги є завжди перевіряються і не можуть бути відключені без фактичної зміни метаданих пакета. Тож ви не можете легко спробувати нову комбінацію. Файли вимог перевіряються лише під час встановлення.


5
це означає, що ви повинні дзеркально відобразити setup.py install_requires=відділи requirements.txt?
проппі

9
Наявність обох вимог у setup.py та файлі вимог небезпечно, оскільки дублювання просто просить не синхронізуватись.
Себастьян Блак

1
Крім того, як ви насправді з цим працюєте? Я припускаю, ви використовуєте файл вимог один раз, щоб перейти до стану, який безумовно працює. Потім встановіть із власним пакетом з pip. Ви ніколи не зможете використовувати, -Uоскільки це може замінити залежності з файлу вимог? Як здійснюється оновлення?
Себастьян Блак

1
Чи однаково ця відповідь стосується додатків та пакетів? Уявіть, що my-web-app (програма) залежить від деякого інструменту (пакета), який обидва залежить від пакету запитів. Якщо якийсь інструмент має файл requirements.txt, який закріплює певну версію або діапазон версій запитів, це, здається, створює потенційну проблему для мого веб-додатку, який міг вказати конфліктуючий діапазон версій / версій.
Reece

2
Повинен бути єдиний спосіб встановити пакет. Тож мати обох не рекомендується, якщо ви не хочете заплутати інших учасників.
Gewthen

17

ось що я помістив у своєму setup.py:

# this grabs the requirements from requirements.txt
REQUIREMENTS = [i.strip() for i in open("requirements.txt").readlines()]

setup(
    .....
    install_requires=REQUIREMENTS
)

20
Обережно, файли вимог можуть містити коментарі та включення. Вам слід використовувати синтаксичний аналізатор
Romain Hardouin

1
так, врешті-решт я змінив це, щоб вилучити коментарі. pip parser виглядає краще, ніж моя відповідь.
rbp

7
Навіщо взагалі використовувати файл вимог, якщо все, що він містить, уже знаходиться в setup.py?
Себастьян Блак

2
@RomainHardouin, як згадувалося в коментарях до вашої відповіді на відповідь, pip не призначений для використання таким чином.
akaihola

1
так, це працювало для мене доти, доки --extra-index-urlне вимагався критичний рівень вимог, і це не підірвало мені обличчя. Дякую @RomainHardouin
Tommy

11

У Посібнику користувача з упаковки Python є сторінка на цю тему, і я настійно рекомендую вам прочитати її:

Короткий зміст:

install_requiresє там, щоб перерахувати залежності пакета, які абсолютно необхідно встановити, щоб пакет міг працювати. Він не призначений для прив’язки залежностей до конкретних версій, але, наприклад, приймаються діапазони install_requires=['django>=1.8']. install_requiresспостерігається pip install name-on-pypiта іншими інструментами.

requirements.txt- це лише текстовий файл, pip install -r requirements.txtпроти якого можна вибрати . Це означало мати версії усіх залежностей і subdependencies покладали, як це: django==1.8.1. Ви можете створити його за допомогою pip freeze > requirements.txt. (Деякі служби, такі як Heroku, автоматично запускаються pip install -r requirements.txtдля вас.) pip install name-on-pypiНе дивиться requirements.txt, лише на install_requires.


5

Я коли-небудь використовую a setup.pyі install_requiresтому, що є лише одне місце, на яке можна подивитися. Це настільки ж потужне, як наявність файлу вимог, і його не потрібно дублювати.


Питання в тому, коли використовувати той чи інший, я не писав цього, але моя відповідь говорить, що я завжди використовую одне, а ніколи інше. Як це не відповісти на питання?
Себастьян Блак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.