web-dev-qa-db-fra.com

Quand utiliser le fichier d'exigences pip par rapport à install_requires dans setup.py?

J'utilise pip avec virtualenv pour empaqueter et installer des bibliothèques Python.

J'imagine que ce que je fais est un scénario assez courant. Je suis le mainteneur de plusieurs bibliothèques pour lesquelles je peux spécifier explicitement les dépendances. Quelques-unes de mes bibliothèques dépendent de bibliothèques tierces qui ont des dépendances transitoires sur lesquelles je n'ai aucun contrôle.

Ce que j'essaie de réaliser, c'est pour un pip install sur 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 fichiers d'exigences peut le faire par lui-même ou si ce n'est qu'un complément à l'utilisation de install_requires.

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

Imaginons que je vis dans un monde imaginaire (je sais, je sais) et mes dépendances en amont sont simples et garanties de ne jamais entrer en conflit ou de rompre la compatibilité descendante. Serais-je obligé d'utiliser un fichier d'exigences pip ou de laisser pip/setuptools/distribuer installer tout basé sur install_requires?

Il y a beaucoup de questions similaires ici, mais je n'ai pas trouvé de questions aussi fondamentales que le moment d'utiliser l'un ou l'autre ou de les utiliser ensemble de manière harmonieuse.

84
Joe Holloway

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 avoir d'exigences de version dont vous n'êtes pas sûr (par exemple, vous ne savez pas si une future version d'une dépendance cassera votre bibliothèque ou non).

En revanche, les fichiers d'exigences doivent indiquer ce que vous savez fonctionne fonctionner, et peuvent inclure des dépendances facultatives que vous recommandez. Par exemple, vous pouvez utiliser SQLAlchemy mais suggérer MySQL, et ainsi mettre MySQLdb dans le fichier d'exigences).

Donc, en résumé: install_requires vise à éloigner les gens des choses que vous savez ne pas fonctionner, tandis que les fichiers d'exigences pour diriger les gens vers des choses que vous savez fonctionnent. Une des raisons à cela est que install_requires les exigences sont toujours vérifiées et ne peuvent pas être désactivées sans réellement changer les métadonnées du package. Vous ne pouvez donc pas facilement essayer une nouvelle combinaison. Les fichiers d'exigences ne sont vérifiés qu'au moment de l'installation.

66
Ian Bicking

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

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

setup(
    .....
    install_requires=REQUIREMENTS
)
13
rbp

Le Python Packaging User Guide a une page sur ce sujet, je vous recommande fortement de le lire:

Sommaire:

install_requires est là pour lister les dépendances du package qui doivent absolument être installées 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 pip install -r requirements.txt contre. Il est censé avoir des versions de toutes les dépendances et sous-dépendances épinglées, 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.) pip install name-on-pypi ne regarde pas requirements.txt, seulement à install_requires.

8
Flimm

J'utilise seulement un setup.py et install_requires car il n'y a qu'un seul endroit à regarder. Il est tout aussi puissant que d'avoir un fichier d'exigences et il n'y a pas de duplication à maintenir.

5
Sebastian Blask