Коротка відповідь полягає в тому, що 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 поза контекстом середовища розробки вашого проекту.