Quand faut-il utiliser le fichier de requête pip par rapport à install_requires dans setup.py?

J’utilise pip avec virtualenv pour empaqueter et installer certaines bibliothèques Python.

J’imagine que ce que je fais est un scénario assez courant. Je suis le responsable de plusieurs bibliothèques pour lesquelles je peux spécifier les dépendances de manière explicite. Certaines de mes bibliothèques dépendent de bibliothèques tierces dotées de dépendances transitives sur lesquelles je n’ai aucun contrôle.

Ce que j’essaie de faire, c’est d’ pip install une pip install sur l’une de mes bibliothèques pour télécharger / installer toutes ses dépendances en amont. Ce qui me pose problème dans la documentation de pip, c’est si / comment les fichiers de spécifications peuvent le faire eux-mêmes ou s’ils ne sont que des compléments à utiliser avec install_requires .

Dois-je utiliser install_requires dans toutes mes bibliothèques pour spécifier des dépendances et des plages de versions, puis utiliser uniquement un fichier d’exigences pour résoudre un conflit et / ou les geler pour une version de production?

Faisons comme si je vivais dans un monde imaginaire (je sais, je sais) et mes dépendances en amont sont simples et garanties de ne jamais être en conflit ou de briser la compatibilité en amont. Est-ce que je serais obligé d’utiliser un fichier de conditions de pip ou simplement laisser pip / setuptools / dissortingbutions installer tout ce qui est basé sur install_requires ?

Il y a beaucoup de questions similaires sur ce sujet, mais je ne pouvais pas en trouver qui soient aussi fondamentales que quand utiliser l’une ou l’autre ou les utiliser ensemble harmonieusement.

Ma philosophie est que install_requires devrait indiquer un minimum de ce dont vous avez besoin. Il peut inclure des exigences de version si vous savez que certaines versions ne fonctionneront pas; mais il ne devrait pas y avoir d’exigences de version où vous n’êtes pas sûr (par exemple, vous n’êtes pas sûr si une future version d’une dépendance va casser votre bibliothèque ou non).

D’autre part, les fichiers de spécifications doivent indiquer ce que vous savez fonctionne et peuvent inclure des dépendances facultatives que vous recommandez. Par exemple, vous pouvez utiliser SQLAlchemy mais suggérer MySQL, et donc mettre MySQLdb dans le fichier d’exigences).

Donc, en résumé: install_requires est de garder les gens éloignés des choses que vous savez ne pas fonctionner, tandis que les fichiers d’exigences pour conduire les gens vers des choses que vous connaissez fonctionnent. L’une des raisons est que les exigences install_requires sont toujours vérifiées et ne peuvent pas être désactivées sans modifier réellement les métadonnées du package. Donc, vous ne pouvez pas facilement essayer une nouvelle combinaison. Les fichiers d’exigences ne sont vérifiés qu’au moment de l’installation.

voici ce que j’ai mis dans mon setup.py:

 # this grabs the requirements from requirements.txt REQUIREMENTS = [i.ssortingp() for i in open("requirements.txt").readlines()] setup( ..... install_requires=REQUIREMENTS ) 

Le Guide de l’utilisateur de Python Packaging contient une page sur ce sujet. Je vous recommande fortement de le lire:

  • install_requires vs Fichiers d’exigences

Résumé:

install_requires est là pour répertorier les dépendances du package qui doit absolument être installé pour que le package fonctionne. Il n’est pas destiné à épingler les dépendances à des versions spécifiques, mais les plages sont acceptées, par exemple install_requires=['django>=1.8'] . install_requires est observé par pip install name-on-pypi et d’autres outils.

requirements.txt est juste un fichier texte, que vous pouvez choisir d’exécuter avec pip install -r requirements.txt . Il est censé avoir des versions de toutes les dépendances et sous-dépendances, comme ceci: django==1.8.1 . Vous pouvez en créer un à l’aide de pip freeze > requirements.txt . (Certains services, comme Heroku, exécutent automatiquement pip install -r requirements.txt pour vous).

Je n’utilise que setup.py et install_requires car il n’y a qu’un seul endroit à regarder. C’est aussi puissant que d’avoir un fichier d’exigences et il n’y a pas de duplication à gérer.