web-dev-qa-db-fra.com

exigences.txt vs setup.py

J'ai commencé à travailler avec Python. J'ai ajouté requirements.txt et setup.py à mon projet. Mais, je suis toujours confus sur le but des deux fichiers. J'ai lu que setup.py est conçu pour les choses redistribuables et que requirements.txt est conçu pour les objets non redistribuables. Mais je ne suis pas certain que cela soit exact.

Comment ces deux fichiers sont-ils vraiment destinés à être utilisés?

62
lucy

Requirements.txt

Cela vous aide à configurer votre environnement de développement. Des programmes comme pip peuvent être utilisés pour installer tous les paquetages listés dans le fichier en un seul coup. Après cela, vous pouvez commencer à développer votre script python. Surtout utile si vous envisagez de faire participer d'autres personnes au développement ou d'utiliser des environnements virtuels. Voici comment vous l'utilisez:

pip install -r < requirements.txt

setup.py

Cela vous permet de créer des packages que vous pouvez redistribuer. Ce script est destiné à installer votre package sur le système de l'utilisateur final et non à préparer l'environnement de développement en tant que pip install -r < requirements.txt Est-ce que. Voir cette réponse pour plus de détails sur setup.py.

Les dépendances de votre projet sont répertoriées dans les deux fichiers.

42
AndreasT

La réponse courte est que requirements.txt Concerne uniquement la liste des exigences relatives aux packages. setup.py, Par contre, ressemble plus à 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 de paquet, l’ensemble de fichiers et de modules à empaqueter (ou compiler, dans le cas de modules natifs (c.-à-d. Écrits en C)), ainsi que les métadonnées à ajouter. vers les python listes de paquets (par exemple, nom du paquet, version du paquet, description du paquet, auteur, ...).

Étant donné que les deux fichiers répertorient des dépendances, cela peut entraîner un peu de duplication. Lire ci-dessous pour plus de détails.

Requirements.txt


Ce fichier répertorie les python. Il s’agit d’un fichier texte brut (éventuellement avec des commentaires) qui répertorie le paquet dépendances de votre python projet (un par ligne). Il ne le fait pas décrivez la façon dont votre paquet python est installé. Vous utiliserez généralement le fichier de configuration 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 python paquets, vous pourriez tomber sur d’autres noms, tels que dev-dependencies.txt Ou dependencies-dev.txt. Ils servent au même but que dependencies.txt Mais répertorie généralement les dépendances supplémentaires présentant un intérêt pour les développeurs du package en question, notamment pour tester le code source (par exemple, pytest, pylint, etc.) avant la publication. Les utilisateurs du package n'auraient généralement pas besoin de l'intégralité du développeur. dépendances pour exécuter le paquet.

Si plusieurs variantes requirements-X.txt Sont présentes, alors l'une d'elles listera les dépendances d'exécution et les autres dépendances de construction ou de test. Certains projets mettent également en cascade leur fichier de configuration, c'est-à-dire lorsqu'un fichier de configuration contient un autre fichier ( exemple ). Cela peut réduire la répétition.

setup.py


Ceci est un script python qui utilise le module setuptools pour définir un package python (nom, fichiers inclus, métadonnées du package et installation)). Comme requirements.txt, Il listera également les dépendances d’exécution du paquet. Setuptools est le moyen de facto de construire et d’installer python paquets, mais il a ses inconvénients, qui Au fil du temps, de nouveaux "gestionnaires de méta-packages", tels que pip, ont vu le jour. Parmi les défauts de setuptools, citons son incapacité à installer plusieurs versions du même package et l'absence de commande de désinstallation.

Quand un python fait pip install ./pkgdir_my_module (Ou pip install my-module), Pip exécutera setup.py Dans le répertoire (ou le module) donné (e). tout module comportant setup.py peut être installé pip, par exemple en 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 lister 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 Entièrement fonctionnel pour votre paquet et que vos dépendances sont pour la plupart externes, vous pouvez envisager d'avoir un 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)
 # .

Le -e Est une option spéciale pip install Qui installe le paquet donné en mode éditable. Lorsque pip -r requirements.txt Est exécuté sur ce fichier, pip installera vos dépendances via la liste dans ./setup.py. L'option éditable placera un lien symbolique dans votre répertoire d'installation (au lieu d'un oeuf ou d'une copie archivée). Il permet aux développeurs de modifier le code en place à partir du référentiel sans avoir à le réinstaller.

Vous pouvez également tirer parti de ce que l'on appelle "les extras de setuptools" lorsque vous avez les deux fichiers dans votre référentiel de paquets. Vous pouvez définir des packages facultatifs dans setup.py sous une catégorie personnalisée et installer ces packages uniquement à partir de cette 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 garderait toutes vos listes de dépendances dans setup.py.

Remarque: Vous exécuterez normalement pip et setup.py à partir d'un bac à sable, tels que ceux créés avec le programme virtualenv. Cela évitera l'installation de python) en dehors du contexte de l'environnement de développement de votre projet.

32
init_js

Par souci d'exhaustivité, voici comment je le vois sous 3 angles différents.

  1. Leurs buts de conception sont différents

Voici la description précise citée dans le documentation officielle (souligné par moi):

Alors que install_requires (dans setup.py) définit les dépendances d’un seul projet , les fichiers de conditions requises sont souvent utilisés pour définir les exigences pour un environnement complet Python .

Alors que les exigences d'installation sont minimales, les fichiers de configuration contiennent souvent une liste exhaustive des versions épinglées dans le but de réaliser des installations répétables d'un environnement complet.

Mais il se peut que ce ne soit pas toujours facile à comprendre, donc dans la section suivante, nous présentons 2 exemples factuels pour montrer comment les 2 approches sont censées être utilisées, différemment.

  1. Leurs usages réels sont donc (supposés être) différents

    • Si votre projet foo doit être publié en tant que bibliothèque autonome (autrement dit, d'autres le feraient probablement import foo), alors vous (et vos utilisateurs en aval) voudriez avoir une déclaration de dépendance flexible, de sorte que votre bibliothèque ne soit pas (et elle ne doit pas) être "difficile" quant à la version exacte de VOS dépendances. Donc, typiquement, votre fichier setup.py contiendrait des lignes comme celle-ci:

      install_requires=[
          'A>=1,<2',
          'B>=2'
      ]
      
    • Si vous voulez simplement "documenter" ou "épingler" votre environnement EXACT actuel pour votre application bar, cela signifie que vous ou vos utilisateurs voudriez utiliser votre application bar en l'état, c'est-à-dire fonctionnement python bar.py, vous pouvez geler votre environnement pour qu'il se comporte toujours de la même manière. Dans ce cas, votre fichier d'exigences ressemblerait à ceci:

      A==1.2.3
      B==2.3.4
      # It could even contain some dependencies NOT strickly required by your library
      pylint==3.4.5
      
  2. En réalité, lequel dois-je utiliser?

    • Si vous développez une application bar qui sera utilisée par python bar.py, même s’il s’agit d’un "script pour le plaisir", il est toujours recommandé d’utiliser REQUEST.TXT car, qui sait, la semaine prochaine (ce qui est Noël), vous recevrez un nouvel ordinateur en cadeau. besoin de configurer votre environnement exact là encore.

    • Si vous développez une bibliothèque foo qui sera utilisée par import foo, vous devez préparer un fichier setup.py. Période. Mais vous pouvez toujours choisir de fournir également un fichier Requirements.txt en même temps, ce qui peut:

      (a) soit être dans le A==1.2.3 style (comme expliqué au point 2 ci-dessus);

      (b) ou contient simplement un single magique .

      .
      

      ce qui équivaudrait à peu près à "installer les exigences en fonction de setup.py" sans duplication. Personnellement, j’estime que cette dernière approche brouille la ligne, ajoute à la confusion et n’apporte PAS une réelle valeur ajoutée, mais c’est néanmoins une astuce dérivée d’une approche mentionnée par Python responsable de l’emballage, Donald in - son blog .

7
RayLuo