2016-08-19 1 views
3

Étant donné requirements.txt et un environnement virtualenv, quelle est la meilleure façon de vérifier à partir d'un script si les conditions sont remplies et éventuellement fournir des détails en cas de discordance?Comment comparer le fichier d'exigences et les modules Python réellement installés?

Pip modifie son API interne avec les versions majeures, donc j'ai vu des conseils pour ne pas utiliser sa méthode parse_requirements.

Il existe un moyen de pkg_resources.require(dependencies), mais comment analyser le fichier des exigences avec tout son sens, comme les liens github, etc.?

Cela devrait être quelque chose de très simple, mais ne trouve pas de pointeurs.

MISE À JOUR: une solution par programme est nécessaire.

+0

Si ces exigences peuvent être installées avec pip, vous pouvez essayer de les installer toutes et si l'utilisateur les a déjà installées, il recevra un message "Exigence déjà satisfaite" et continuera avec l'installation suivante. Vous pouvez aussi, à l'intérieur de votre code, attraper une dépendance manquante dans une instruction try-except et, en cas d'absence, demander à l'utilisateur s'il veut l'installer. – coder

Répondre

3

Vous pouvez enregistrer vos paquets installés en cours de virtualenv avec pip freeze dans un fichier, dire current.txt

pip freeze > current.txt 

Ensuite, vous pouvez comparer à requirements.txt avec difflib en utilisant un script comme this:

import difflib 

req = open('requirements.txt') 
current = open('current.txt') 

diff = difflib.ndiff(req.readlines(), current.readlines()) 
delta = ''.join([x for x in diff if x.startswith('-')]) 

print(delta) 

Ceci devrait afficher uniquement les paquets qui sont dans 'requirements.txt' qui ne sont pas dans 'current.txt'.

+1

Ceci est très bruyant: les spécificateurs ne sont pas comparés correctement et signalés comme des changements (par exemple,> = 8.2 et = 8.2 sont signalés, donc ce n'est pas une violation). En outre, le contrôle ne devrait pas exiger humain quand il n'y a pas de problèmes (j'ai mis en gras dans la question et ajouté la mise à jour pour le rendre encore plus clair). –

+3

Aussi, un indice pour ceux qui peuvent être satisfaits de la réponse: utilisez 'pip freeze -r requirements.txt> current.txt' pour préserver la commande. Il signale également certaines discordances de cas. –