Коротка відповідь полягає в тому, що requirements.txtце стосується лише переліку вимог до пакету. setup.pyз іншого боку, це більше схоже на сценарій встановлення. Якщо ви не плануєте встановлювати код python, як правило, вам знадобиться лише requirements.txt.
Файл setup.pyописує, крім залежностей пакета, набір файлів і модулів, які слід упакувати (або скомпілювати, якщо мова йде про власні модулі (тобто записані на C)), і метадані, які потрібно додати до списків пакетів python ( наприклад, назва пакета, версія пакета, опис пакета, автор, ...).
Оскільки обидва файли перелічують залежності, це може призвести до невеликого дублювання. Детальніше читайте нижче.
вимоги.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у вказаному каталозі (або модулі). Подібним чином, будь-який модуль, який має a, 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 поза контекстом середовища розробки вашого проекту.