La réponse courte est que requirements.txt
c'est pour lister les exigences des packages uniquement. setup.py
d'autre part, c'est plus comme un script d'installation. Si vous ne prévoyez pas d'installer le code python, vous n'aurez généralement besoin que de requirements.txt
.
Le fichier setup.py
décrit, en plus des dépendances du package, l'ensemble des fichiers et des modules qui doivent être packagés (ou compilés, dans le cas des modules natifs (c'est-à-dire écrits en C)), et les métadonnées à ajouter aux listes de packages python ( ex. nom du package, version du package, description du package, auteur, ...).
Étant donné que les deux fichiers répertorient les dépendances, cela peut entraîner un peu de duplication. Lisez ci-dessous pour plus de détails.
requirements.txt
Ce fichier répertorie les exigences du package Python. Il s'agit d'un fichier texte brut (éventuellement avec des commentaires) qui répertorie les dépendances de package de votre projet python (une par ligne). Il ne décrit pas la manière dont votre package python est installé. Vous consommez généralement le fichier des exigences avec pip install -r requirements.txt
.
Le nom de fichier du fichier texte est arbitraire, mais est souvent requirements.txt
par convention. Lorsque vous explorez les référentiels de code source d'autres packages python, vous pouvez tomber sur d'autres noms, tels que dev-dependencies.txt
ou dependencies-dev.txt
. Celles-ci ont le même objectif, dependencies.txt
mais répertorient généralement des dépendances supplémentaires d'intérêt pour les développeurs du paquet particulier, à savoir pour tester le code source (par exemple pytest, pylint, etc.) avant la publication. Les utilisateurs du package n'ont généralement pas besoin de l'ensemble complet de dépendances de développeur pour exécuter le package.
Si plusieurs requirements-X.txt
variantes sont présentes, l'une répertoriera généralement les dépendances d'exécution et l'autre au moment de la construction ou testera les dépendances. Certains projets mettent également en cascade leur fichier d'exigences, c'est-à-dire lorsqu'un fichier d'exigences comprend un autre fichier ( exemple ). Cela peut réduire la répétition.
setup.py
Il s'agit d'un script python qui utilise le setuptools
module pour définir un package python (nom, fichiers inclus, métadonnées du package et installation). Il listera requirements.txt
également les dépendances d'exécution du package. Setuptools est le moyen de facto de construire et d'installer des paquets python, mais il a ses défauts, qui au fil du temps ont poussé au développement de nouveaux «gestionnaires de méta-paquets», comme pip. Des exemples de défauts de setuptools sont son incapacité à installer plusieurs versions du même package et l'absence de commande de désinstallation.
Lorsqu'un utilisateur python le fait pip install ./pkgdir_my_module
(ou pip install my-module
), pip s'exécutera 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 s'exécutant à pip install .
partir du même dossier.
Ai-je vraiment besoin des deux?
La réponse courte est non, mais c'est bien d'avoir les deux. Ils atteignent des objectifs différents, mais ils peuvent tous deux être utilisés pour répertorier vos dépendances.
Vous pouvez envisager une astuce pour éviter de dupliquer votre liste de dépendances entre requirements.txt
et setup.py
. Si vous avez déjà écrit un setup.py
package entièrement fonctionnel pour votre package et que vos dépendances sont principalement externes, vous pouvez envisager d'avoir une version simple requirements.txt
avec uniquement les éléments suivants:
# 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)
# .
Il -e
s'agit d'une pip install
option spéciale qui installe le package donné en mode modifiable . Quand 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). Il permet aux développeurs de modifier le code en place à partir du référentiel sans le réinstaller.
Vous pouvez également profiter de ce qu'on appelle les "extras setuptools" lorsque vous avez les deux fichiers dans votre référentiel de packages. Vous pouvez définir des packages facultatifs dans setup.py sous une catégorie personnalisée et installer ces packages à partir de cette catégorie uniquement avec pip:
# setup.py
from setuptools import setup
setup(
name="FOO"
...
extras_require = {
'dev': ['pylint'],
'build': ['requests']
}
...
)
puis, 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 conserverait toutes vos listes de dépendances dans setup.py.
Remarque : 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 packages python en dehors du contexte de l'environnement de développement de votre projet.