443 votes

Référence requirements.txt pour le kwarg install_requires dans le fichier setuptools setup.py

Tengo un requirements.txt que j'utilise avec Travis-CI. Il semble idiot de dupliquer les exigences dans les deux fichiers requirements.txt y setup.py J'espérais donc pouvoir passer une poignée de fichier à la fonction install_requires kwarg en setuptools.setup .

Est-ce possible ? Si oui, comment dois-je procéder ?

Voici mon requirements.txt fichier :

guessit>=0.5.2
tvdb_api>=1.8.2
hachoir-metadata>=1.3.3
hachoir-core>=1.3.3
hachoir-parser>=1.3.4

10 votes

install_requires est utilisé pour déclarer les dépendances sur les paquets qui sont nécessaires au fonctionnement du paquet et qui sont utilisées par le développeur du paquet, tandis que requirements.txt est utilisé pour automatiser l'installation d'environnements, ce qui permet d'installer des logiciels supplémentaires et d'effectuer l'épinglage des versions, et est utilisé par les administrateurs système qui déploient le paquet. Leur rôle et leur public cible diffèrent considérablement, donc essayer de les combiner comme le souhaite l'OP est une véritable erreur de conception à mon avis.

9 votes

Mes deux centimes. N'utilisez pas requirements.txt dans votre setup.py. Les objectifs sont différents, sontd caremad.io/2013/07/setup-vs-requirement

8 votes

Je vois beaucoup de réponses compliquées. Qu'est-ce qui ne va pas avec une bonne vieille [line.strip() for line in open("requirements.txt").readlines()] ?

340voto

Romain Hardouin Points 690

Vous pouvez inverser la situation et lister les dépendances dans la rubrique setup.py et ne comportent qu'un seul caractère - un point . - en requirements.txt au lieu de cela.


Par ailleurs, même si cela n'est pas conseillé, il est toujours possible d'analyser le fichier requirements.txt (s'il ne renvoie pas à des exigences externes par URL) avec le hack suivant (testé avec pip 9.0.1 ) :

install_reqs = parse_requirements('requirements.txt', session='hack')

Cela ne filtre pas marqueurs d'environnement mais


Dans les anciennes versions de pip, plus précisément plus ancien que 6.0 Il existe une API publique qui peut être utilisée à cette fin. Un fichier d'exigences peut contenir des commentaires ( # ) et peut inclure d'autres fichiers ( --requirement o -r ). Ainsi, si vous voulez vraiment analyser un fichier requirements.txt vous pouvez utiliser l'analyseur pip :

from pip.req import parse_requirements

# parse_requirements() returns generator of pip.req.InstallRequirement objects
install_reqs = parse_requirements(<requirements_path>)

# reqs is a list of requirement
# e.g. ['django==1.5.1', 'mezzanine==1.4.6']
reqs = [str(ir.req) for ir in install_reqs]

setup(
    ...
    install_requires=reqs
)

36 votes

Que se passe-t-il si l'utilisateur n'a pas installé Pip ? Ka-boom ?

152 votes

@GringoSuave Si l'utilisateur n'a pas installé pip, il doit d'abord l'installer.

4 votes

Qu'en est-il des exigences de git ?

150voto

frb Points 2722

Il ne peut pas prendre de poignée de fichier. Les install_requires L'argument peut ne peut être qu'une chaîne de caractères ou une liste de chaînes de caractères .

Vous pouvez, bien sûr, lire votre fichier dans le setup script et le passer comme une liste de chaînes à install_requires .

import os
from setuptools import setup

with open('requirements.txt') as f:
    required = f.read().splitlines()

setup(...
install_requires=required,
...)

8 votes

Bien qu'utile, elle modifie la spécification des exigences, qui passe d'un mode déclaratif à un mode impératif. Il est donc impossible pour certains outils de savoir quelles sont vos exigences. Par exemple, PyCharm propose l'installation automatique de toutes les exigences spécifiées dans la section install_requires . Cependant, cela ne fonctionne pas si vous n'utilisez pas la syntaxe déclarative.

81 votes

@PiotrDobrogost Peut-être que le développeur de PyCharm devrait corriger son programme alors. setup.py est un programme qui doit être exécuté, et non un fichier de données qui doit être analysé. Cela ne rend pas cette réponse plus mauvaise.

5 votes

Je ne fais que signaler les problèmes possibles ; cette réponse est tout à fait correcte. PyCharm n'est pas le seul à avoir des problèmes avec les informations "cachées" derrière le code. C'est un problème universel et c'est pourquoi il y a un mouvement général vers la spécification déclarative des métadonnées dans l'emballage Python.

70voto

Tobu Points 10101

Les fichiers d'exigences utilisent un format de pipeline étendu, qui n'est utile que si vous avez besoin de compléter vos fichiers d'exigences. setup.py avec des contraintes plus fortes, par exemple en spécifiant les urls exactes dont certaines dépendances doivent provenir, ou la sortie de pip freeze pour geler l'ensemble des paquets à des versions connues et fonctionnelles. Si vous n'avez pas besoin de ces contraintes supplémentaires, utilisez uniquement une option setup.py . Si vous sentez que vous avez vraiment besoin d'expédier une requirements.txt Quoi qu'il en soit, vous pouvez en faire une seule ligne :

.

Il sera valide et se référera exactement au contenu de la rubrique setup.py qui se trouve dans le même répertoire.

13 votes

Mais dans ce cas, il essaierait également d'installer mon application. Et si je n'en ai pas besoin et que je veux seulement installer install_requires ?

3 votes

Pour développer la question de @ffeast, si les exigences n'existent que dans setup.py, existe-t-il un moyen d'installer les exigences (équivalent de pip install -r requirements.txt ) sans installer le paquet lui-même ?

1 votes

@ffeast @haridsv -e . devrait suffire. Consultez cette page : caremad.io/posts/2013/07/setup-vs-requirement

42voto

famousgarkin Points 3484

Bien qu'il ne s'agisse pas d'une réponse exacte à la question, je recommande l'article du blog de Donald Stufft à l'adresse suivante https://caremad.io/2013/07/setup-vs-requirement/ pour une bonne approche de ce problème. Je l'ai utilisé avec beaucoup de succès.

En bref, requirements.txt n'est pas un setup.py mais un complément de déploiement. Conserver une abstraction appropriée des dépendances des paquets dans le fichier setup.py . Ensemble requirements.txt ou plus pour récupérer des versions spécifiques de dépendances de paquets pour le développement, les tests ou la production.

Par exemple, avec les paquets inclus dans le répertoire sous deps/ :

# fetch specific dependencies
--no-index
--find-links deps/

# install package
# NOTE: -e . for editable mode
.

pip exécute la commande setup.py et installe les versions spécifiques des dépendances déclarées dans le fichier install_requires . Il n'y a pas de double emploi et l'objectif des deux artefacts est préservé.

8 votes

Cela ne fonctionne pas lorsque vous souhaitez fournir un paquet que d'autres personnes peuvent installer par l'intermédiaire de pip install my-package . Si les dépendances de mon paquet ne sont pas listées dans my-package/setup.py, elles ne sont pas installées par pip install my-package . Je n'ai pas réussi à déterminer comment fournir un paquetage pour les autres qui inclut des dépendances sans les indiquer explicitement dans setup.py. J'aimerais savoir si quelqu'un a trouvé un moyen de garder DRY tout en permettant à d'autres d'installer mon paquet + les dépendances sans télécharger le fichier d'exigences et appeler manuellement pip install -r my-package/requirements.txt .

2 votes

@Malina Le paquet ici est parfaitement installable sans requirements.txt . C'est là tout l'intérêt. Mise à jour de la question pour plus de clarté. Mise à jour également du lien vers un article de blog obsolète.

0 votes

Ainsi, lors de l'exécution de setup.py, le fichier requirements.txt sera appelé pour les versions spécifiques des fichiers listés dans stup.py ?

24voto

L'utilisation parse_requirements est problématique car l'API pip n'est pas publiquement documentée et prise en charge. Dans pip 1.6, cette fonction est en fait déplacée, de sorte que les utilisations existantes de cette fonction sont susceptibles d'être interrompues.

Un moyen plus fiable d'éliminer les doublons entre les setup.py y requirements.txt est de spécifier vos dépendances dans setup.py puis mettre -e . dans votre requirements.txt fichier. Certaines informations provenant de l'un des pip Les développeurs qui expliquent pourquoi il s'agit d'une meilleure solution sont disponibles ici : https://caremad.io/blog/setup-vs-requirement/

1 votes

@Tommy Essayez ceci : caremad.io/2013/07/setup-vs-requirement Il s'agit du même lien que celui indiqué dans une autre réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X