Когда использовать файл требований к файлам по сравнению с install_requires в файле setup.py?

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

Я бы предположил, что я делаю довольно распространенный сценарий. Я поддерживаю несколько библиотек, для которых я могу явно указать зависимости. Некоторые из моих библиотек зависят от сторонних библиотек, которые имеют транзитивные зависимости, над которыми я не контролирую.

То, что я пытаюсь достичь, - это pip install в одной из моих библиотек для загрузки/установки всех своих зависимостей над потоком. То, с чем я сталкиваюсь в документации на pip, - это если /how файлы требований могут сделать это самостоятельно или если они действительно просто дополнение к использованию install_requires.

Я бы использовал install_requires во всех моих библиотеках, чтобы указать зависимости и диапазоны версий, а затем использовать файл требований для разрешения конфликта и/или заморозить их для сборки сборки?

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

Здесь есть много похожих вопросов, но я не мог найти ни одного элемента, который был бы таким же базовым, как когда бы он использовался, или использовать их вместе гармонично.

Ответ 1

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

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

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

Ответ 2

вот что я ввел в свой setup.py:

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

setup(
    .....
    install_requires=REQUIREMENTS
)

Ответ 3

В руководстве пользователя Python Packaging есть страница об этой теме, я настоятельно рекомендую вам прочитать ее:

Резюме:

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

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

Ответ 4

Я использую только setup.py и install_requires, потому что есть только одно место для просмотра. Он столь же мощный, как и файл требований, и нет дублирования для поддержки.