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

94

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 explicitement les dépendances. Certaines de mes bibliothèques dépendent de bibliothèques tierces qui ont des dépendances transitives sur lesquelles je n'ai aucun contrôle.

Ce que j'essaie de réaliser, c'est que l' pip installune de mes bibliothèques télécharge / installe toutes ses dépendances en amont. Ce avec quoi je me débat dans la documentation de pip, c'est si / comment les fichiers d'exigences peuvent le faire eux-mêmes ou s'ils ne sont vraiment qu'un complément à l'utilisation install_requires.

Est-ce que j'utiliserais install_requiresdans toutes mes bibliothèques pour spécifier des dépendances et des plages de versions, puis utiliserais uniquement un fichier d'exigences pour résoudre un conflit et / ou les figer pour une version de production?

Supposons 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 rompre la compatibilité descendante. Serais-je obligé d'utiliser un fichier d'exigences pip ou simplement laisser pip / setuptools / distribuer tout installer en fonction install_requires?

Il y a beaucoup de questions similaires ici, mais je n'ai pas trouvé de questions aussi basiques que de savoir quand utiliser l'une ou l'autre ou les utiliser ensemble harmonieusement.

Joe Holloway
la source
3
C'est un très bel article expliquant la relation entre les deux, et aussi comment ils s'intègrent.
Björn Pollex

Réponses:

68

Ma philosophie est que cela install_requiresdevrait 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 pour lesquelles vous n'êtes pas sûr (par exemple, vous n'êtes pas sûr si une future version d'une dépendance cassera votre bibliothèque ou non).

Fichiers Exigences d'autre part doivent indiquer ce que vous savez ne travail, et peuvent inclure des dépendances optionnelles que vous préconisez. Par exemple, vous pouvez utiliser SQLAlchemy mais suggérer MySQL, et ainsi mettre MySQLdb dans le fichier des exigences).

Donc, en résumé: install_requiresc'est é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. L'une des raisons à cela est que les install_requiresexigences sont toujours vérifiées et ne peuvent pas être désactivées sans modifier réellement 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.

Ian Bicking
la source
5
cela signifie-t-il que vous devez refléter les setup.py install_requires=déps requirements.txt?
proppy
9
Avoir les deux, des exigences dans setup.py et un fichier d'exigences est cependant dangereux, car la duplication demande simplement à se désynchroniser.
Sebastian Blask
1
Aussi, comment travaillez-vous réellement avec? Je suppose que vous utilisez le fichier des exigences une fois pour obtenir un état qui fonctionne vraiment. Ensuite, installez avec le package réel avec pip. Vous ne pourrez jamais l'utiliser -Ucar cela pourrait remplacer les dépendances du fichier des exigences? Comment mettez-vous à niveau?
Sebastian Blask
1
Cette réponse s'applique-t-elle également aux applications et aux packages? Imaginez my-web-app (une application) dépendant d'un outil (un package), qui dépendent tous deux du package de requêtes. Si some-tool a un fichier requirements.txt qui épingle une version particulière ou une plage de versions de requêtes, cela semble créer un problème potentiel pour my-web-app, qui pourrait avoir spécifié une version / plage de versions en conflit.
Reece
2
Il ne devrait y avoir qu'un seul moyen d'installer un package. Donc, avoir les deux n'est pas recommandé à moins que vous ne vouliez confondre les autres contributeurs.
Gewthen
17

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
)
rbp
la source
20
Attention, les fichiers d'exigences peuvent contenir des commentaires et des inclusions. Vous devriez utiliser l'analyseur pip
Romain Hardouin
1
oui, j'ai finalement changé cela pour supprimer les commentaires. pip parser semble mieux que ma réponse.
rbp
7
Pourquoi utiliser un fichier d'exigences si tout ce qu'il contient est déjà dans setup.py?
Sebastian Blask
2
@RomainHardouin, comme mentionné dans les commentaires de votre réponse liée, pip n'est pas destiné à être utilisé de cette façon.
akaihola
1
oui, cela a fonctionné pour moi jusqu'à ce qu'un critique --extra-index-urldans les exigences soit requis et cela m'a explosé au visage. Merci @RomainHardouin
Tommy
11

Le guide de l'utilisateur de Python Packaging a une page sur ce sujet, je vous recommande vivement de la lire:

Résumé:

install_requiresest là pour lister les dépendances du package qui doivent absolument être installées pour que le package fonctionne. Il ne vise pas à épingler les dépendances à des versions spécifiques, mais les plages sont acceptées, par exemple install_requires=['django>=1.8']. install_requiresest observé par pip install name-on-pypiet d'autres outils.

requirements.txtest juste un fichier texte sur lequel vous pouvez choisir d'exécuter pip install -r requirements.txt. Il est censé avoir les versions de toutes les dépendances et subdependencies épinglés, comme ceci: django==1.8.1. Vous pouvez en créer un en utilisant pip freeze > requirements.txt. (Certains services, comme Heroku, s'exécutent automatiquement pip install -r requirements.txtpour vous.) pip install name-on-pypiNe regarde pas requirements.txt, seulement install_requires.

Flimm
la source
5

Je n'utilise que setup.pyet install_requiresparce qu'il n'y a qu'un seul endroit à regarder. C'est tout aussi puissant que d'avoir un fichier d'exigences et il n'y a pas de duplication à maintenir.

Sebastian Blask
la source
La question est de savoir quand utiliser l'un ou l'autre, je ne l'ai pas précisé, mais ma réponse est que j'utilise toujours l'un et jamais l'autre. Comment cela ne répond-il pas à la question?
Sebastian Blask