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


Я с помощью pip в виртуальное окружение, чтобы упаковать и установить некоторые библиотеки Python.

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

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

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

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

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

4 82

4 ответа:

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

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

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

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

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

setup(
    .....
    install_requires=REQUIREMENTS
)

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

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