Короткий ответ: только requirements.txtдля перечисления требований к пакету. setup.pyс другой стороны, это больше похоже на сценарий установки. Если вы не планируете устанавливать код Python, обычно вам понадобится только requirements.txt.
Файл setup.pyописывает, помимо зависимостей пакетов, набор файлов и модулей, которые должны быть упакованы (или скомпилированы, в случае собственных модулей (т.е. написанных на C)), и метаданные для добавления в списки пакетов python ( например, имя пакета, версия пакета, описание пакета, автор, ...).
Поскольку в обоих файлах перечислены зависимости, это может привести к небольшому дублированию. Подробности читайте ниже.
requirements.txt
В этом файле перечислены требования к пакету Python. Это простой текстовый файл (необязательно с комментариями), в котором перечислены зависимости пакетов вашего проекта python (по одной в каждой строке). Он не описывает способ установки вашего пакета python. Обычно вы используете файл требований с расширением pip install -r requirements.txt.
Имя текстового файла может быть произвольным, но часто requirements.txtпо соглашению. Изучая репозитории исходного кода других пакетов Python, вы можете наткнуться на другие имена, такие как dev-dependencies.txtили dependencies-dev.txt. Они служат той же цели, dependencies.txtно обычно перечисляют дополнительные зависимости, представляющие интерес для разработчиков конкретного пакета, а именно для тестирования исходного кода (например, pytest, pylint и т. Д.) Перед выпуском. Пользователям пакета обычно не требуется весь набор зависимостей разработчика для запуска пакета.
Если присутствует несколько requirements-X.txtвариантов, то обычно в одном будут перечислены зависимости времени выполнения, а в другом - зависимости времени сборки или тестирования. Некоторые проекты также каскадируют свои файлы требований, т.е. когда один файл требований включает другой файл ( пример ). Это может уменьшить количество повторений.
setup.py
Это сценарий python, который использует setuptoolsмодуль для определения пакета python (имя, включенные файлы, метаданные пакета и установка). Он также будет requirements.txtотображать зависимости пакета во время выполнения. Setuptools - это де-факто способ создания и установки пакетов python, но он имеет свои недостатки, которые со временем привели к разработке новых «менеджеров метапакетов», таких как pip. Примеры недостатков setuptools - это невозможность установить несколько версий одного и того же пакета и отсутствие команды удаления.
Когда пользователь python делает pip install ./pkgdir_my_module(или pip install my-module), pip запускается setup.pyв данном каталоге (или модуле). Точно так же любой модуль, у которого есть, setup.pyможно установить pip, например, запустив его pip install .из той же папки.
Мне действительно нужны оба?
Короткий ответ - нет, но приятно иметь и то, и другое. Они достигают разных целей, но оба могут использоваться для перечисления ваших зависимостей.
Есть один прием, который вы можете использовать, чтобы избежать дублирования списка зависимостей между requirements.txtи setup.py. Если вы уже написали полностью рабочий setup.pyпакет для своего пакета, и ваши зависимости в основном внешние, вы можете подумать о простом пакете requirements.txtтолько со следующим:
# requirements.txt
#
# installs dependencies from ./setup.py, and the package itself,
# in editable mode
-e .
# (the -e above is optional). you could also just install the package
# normally with just the line below (after uncommenting)
# .
Это -eспециальная pip installопция, которая устанавливает данный пакет в редактируемом режиме. При pip -r requirements.txtзапуске этого файла pip установит ваши зависимости через список в ./setup.py. Редактируемый вариант поместит символическую ссылку в ваш установочный каталог (вместо яйца или заархивированной копии). Это позволяет разработчикам редактировать код на месте из репозитория без переустановки.
Вы также можете воспользоваться тем, что называется «дополнительными средствами setuptools», если у вас есть оба файла в репозитории пакетов. Вы можете определить дополнительные пакеты в setup.py в настраиваемой категории и установить эти пакеты только из этой категории с помощью pip:
# setup.py
from setuptools import setup
setup(
name="FOO"
...
extras_require = {
'dev': ['pylint'],
'build': ['requests']
}
...
)
а затем в файле требований:
# install packages in the [build] category, from setup.py
# (path/to/mypkg is the directory where setup.py is)
-e path/to/mypkg[build]
Это сохранит все ваши списки зависимостей внутри setup.py.
Примечание . Обычно pip и setup.py выполняются из песочницы, например, созданной с помощью программы virtualenv. Это позволит избежать установки пакетов python вне контекста среды разработки вашего проекта.