La réponse courte est que requirements.txt
ne sert qu'à énumérer les exigences du paquet. setup.py
d'autre part est plus comme une installation script. setup.py
décrit, en plus des dépendances du paquet, l'ensemble des fichiers et modules qui doivent être empaquetés (ou compilés, dans le cas de modules natifs (c'est-à-dire écrits en C)), et les métadonnées à ajouter aux listes de paquets python (par exemple le nom du paquet, la version du paquet, la description du paquet, l'auteur, ...).
Comme les deux fichiers listent les dépendances, cela peut conduire à un peu de duplication. Lisez ci-dessous pour plus de détails.
exigences.txt
Ce fichier liste les exigences du paquetage python. Il s'agit d'un fichier texte brut (avec éventuellement des commentaires) qui répertorie le paquetage Dépendances de votre projet python (un par ligne). Il s'agit de n'est pas décrivent la manière dont votre paquetage python est installé. Vous consommerez généralement le fichier d'exigences avec pip install -r requirements.txt
.
Le nom de fichier du fichier texte est arbitraire, mais est souvent requirements.txt
par convention. En explorant les dépôts de code source d'autres paquets python, vous pouvez tomber sur d'autres noms, tels que dev-dependencies.txt
o dependencies-dev.txt
. Ils servent le même objectif que dependencies.txt
mais listent généralement les dépendances supplémentaires qui intéressent les développeurs du paquet particulier, notamment pour tester le code source (par exemple, pytest, pylint, etc.) avant la publication. Les utilisateurs du paquet n'ont généralement pas besoin de l'ensemble des dépendances des développeurs pour exécuter le paquet.
Si plusieurs requirements-X.txt
sont présentes, alors généralement l'une d'entre elles liste les dépendances d'exécution, et l'autre les dépendances de construction ou de test. Certains projets ont également un fichier d'exigences en cascade, c'est-à-dire que lorsqu'un fichier d'exigences inclut un autre fichier ( exemple ). Cela permet de réduire les répétitions.
setup.py
Il s'agit d'un script en python qui utilise la fonction setuptools
pour définir un paquet python (nom, fichiers inclus, métadonnées du paquet et installation). Il va, comme requirements.txt
, liste également les dépendances d'exécution du paquet. Setuptools est le moyen de facto de construire et d'installer des paquets python, mais il a ses défauts, qui avec le temps ont favorisé le développement de nouveaux "méta-gestionnaires de paquets", comme pip. Les exemples de défauts de setuptools sont son incapacité à installer plusieurs versions d'un même paquet, et l'absence d'une commande de désinstallation.
Lorsqu'un utilisateur de python fait pip install ./pkgdir_my_module
(ou pip install my-module
), pip va exécuter setup.py
dans le répertoire (ou module) donné. De même, tout module qui a un setup.py
peut être pip
-installé, par exemple en exécutant pip install .
dans le même dossier.
Ai-je vraiment besoin des deux ?
La réponse courte est non, mais c'est bien d'avoir les deux. Ils ont des objectifs différents, mais ils peuvent tous deux être utilisés pour lister vos dépendances.
Il y a une astuce que vous pouvez envisager pour éviter de dupliquer votre liste de dépendances entre requirements.txt
y setup.py
. Si vous avez écrit un setup.py
pour votre paquet et que vos dépendances sont principalement externes, vous pourriez envisager d'avoir un simple requirements.txt
avec seulement les éléments suivants :
# requirements.txt
#
# installs dependencies from ./setup.py, and the package itself,
# in editable mode
-e .
El -e
est une spéciale pip install
qui installe le paquet donné dans éditable mode. Lorsque pip -r requirements.txt
est exécuté sur ce fichier, pip installera vos dépendances via la liste dans ./setup.py
. L'option modifiable placera un lien symbolique dans votre répertoire d'installation (au lieu d'un œuf ou d'une copie archivée). Cela permet aux développeurs de modifier le code en place à partir du référentiel sans avoir à réinstaller.
Vous pouvez également profiter de ce que l'on appelle "setuptools extras" lorsque vous avez les deux fichiers dans votre dépôt de paquets. Vous pouvez définir des paquets optionnels dans setup.py sous une catégorie personnalisée, et installer ces paquets à partir de cette seule catégorie avec pip :
# setup.py
from setuptools import setup
setup(
name="FOO"
...
extras_require = {
'dev': ['pylint'],
'build': ['requests']
}
...
)
et ensuite, dans le fichier des exigences :
# install packages in the [build] category, from setup.py
# (path/to/mypkg is the directory where setup.py is)
-e path/to/mypkg[build]
Cela permet de conserver toutes vos listes de dépendances dans le fichier setup.py.
Nota : Vous exécutez normalement pip et setup.py à partir d'un bac à sable, comme ceux créés avec le programme. virtualenv
. Cela évitera d'installer des paquets python en dehors du contexte de l'environnement de développement de votre projet.