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

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

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

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

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

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

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


person Joe Holloway    schedule 04.08.2011    source источник
comment
Это очень хорошая статья, объясняющая их отношения, а также то, как они интегрируются.   -  person Björn Pollex    schedule 20.11.2014
comment
Связанный: stackoverflow.com/questions/14399534/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 05.04.2021


Ответы (4)


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

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

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

person Ian Bicking    schedule 16.08.2011
comment
означает ли это, что вы должны зеркалировать setup.py install_requires= deps в requirements.txt? - person proppy; 26.09.2013
comment
Однако наличие обоих требований в setup.py и файле требований опасно, потому что дублирование просто требует рассинхронизации. - person Sebastian Blask; 13.11.2013
comment
Кроме того, как же тогда с этим работать? Я предполагаю, что вы используете файл требований один раз, чтобы перейти в состояние, которое определенно работает. Затем установите фактический пакет с помощью pip. Вы никогда не сможете использовать -U, потому что это может переопределить зависимости из файла требований? Как вы обновляетесь? - person Sebastian Blask; 13.11.2013
comment
Применимо ли этот ответ в равной степени к приложениям и пакетам? Представьте себе my-web-app (приложение), зависящее от некоторого инструмента (пакета), оба из которых зависят от пакета запросов. Если у some-tool есть файл requirements.txt, который закрепляет определенную версию или диапазон версий запросов, это может создать потенциальную проблему для my-web-app, которое могло указать конфликтующий диапазон версий / версий. - person Reece; 06.03.2014
comment
Должен быть только способ установить пакет. Поэтому использовать оба варианта не рекомендуется, если вы не хотите запутать других участников. - person Gewthen; 17.10.2015

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

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

setup(
    .....
    install_requires=REQUIREMENTS
)
person rbp    schedule 11.03.2013
comment
Обратите внимание, файлы требований могут содержать комментарии и включения. Вам следует используйте парсер pip - person Romain Hardouin; 10.06.2013
comment
да, в конце концов я изменил это, чтобы убрать комментарии. pip parser выглядит лучше, чем мой ответ. - person rbp; 10.06.2013
comment
Зачем вообще использовать файл требований, если все, что он содержит, уже находится в setup.py? - person Sebastian Blask; 13.11.2013
comment
@RomainHardouin, как упоминалось в комментариях к вашему связанному ответу, pip не предназначен для использования таким образом. - person akaihola; 23.05.2014
comment
да, это работало для меня, пока не потребовался критический --extra-index-url в требованиях, и это взорвалось мне в лицо. Спасибо @RomainHardouin - person Tommy; 08.02.2016
comment
Очень круто, но не решило мою проблему смешанных требований pypi и artifactory. - person Dave McNulla; 14.04.2020

В Руководстве пользователя 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.

person Flimm    schedule 12.10.2016

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

person Sebastian Blask    schedule 13.11.2013
comment
Вопрос в том, когда использовать одно или другое, я не объяснял его, но мой ответ гласит, что я всегда использую один, а не другой. Как это не ответ на вопрос? - person Sebastian Blask; 12.01.2015