Короткий ответ: только 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 вне контекста среды разработки вашего проекта.