Когда использовать файл требований pip по сравнению с install_requires в setup.py? - PullRequest
83 голосов
/ 05 августа 2011

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

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

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

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

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

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

Ответы [ 4 ]

65 голосов
/ 17 августа 2011

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

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

13 голосов
/ 11 марта 2013

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

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

setup(
    .....
    install_requires=REQUIREMENTS
)
8 голосов
/ 12 октября 2016

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

5 голосов
/ 13 ноября 2013

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

...