Les Crash-Devs d'un Passionné

Comment mieux gérer ses dépendances en python

/Catégorie/python

Temps de lecture : 4 minutes

Lorsque l'on utilise beaucoup de librairies on peut rapidement être confronté à conserver des dépendances non utilisées. Cela n'est pas utile, la maintenance de votre application devient plus complexe et le poids de votre application est inutilement grossi.

Nous allons voir plusieurs techniques pour résoudre ces problématiques.

La solution graphique avec pipdeptree

Il faut installer la librairie python pipdeptree et lancer la génération de l'arbre de vos dépendances

pipdeptree --graph-output dot > dependencies.dot

Ce fichier respecte le formalisme de description des graphes sous un format texte. De cette manière il pourra être fourni au second outil graphviz pour créer la représentation graphique.

Pour exploiter le fichier dot il faut installer graphviz sur l'OS et pas depuis pypi.

Pour générer l'image png des dépendances on utilise cette commande

dot dependencies.dot -Tpng -o out.png

On peut éviter l'installation du binaire graphviz si on veut générer l'image depuis pipdeptree. Pour cela on installe graphviz depuis pypi

pipenv install graphviz --dev

Et on génère l'image du graphe

pipenv run pipdeptree --graph-output png > dependencies.png

Ainsi on obtient dans les 2 cas une image PNG représentant la hiérarchie entre les différentes librairies de votre projet. On visualise rapidement les dépendances n'ayant pas de liens et donc ce sont des librairies potentiellement à désinstaller.

graph

La solution avec un linter

Pour faire le lint de mes projets j'utilise flake8, comme évoqué dans cet article sur le lint. Ce dernier possède un plugin pour vérifier la présence d'une librairie dans les dépendances (setup.py ou requirements.txt)

Après installation, il suffit de lancer votre flake8 pour retrouver dans la console les modules sous le tag I900 (Package is not listed as a requirement) et I901 (Package is require but not used)

./build/lib/models/seo_page.py:1:1: I900 'wagtail.core.models' not listed as a requirement

Ainsi on connait les dépendances non inscrites dans le setup.py ou requirements.txt

La solution avec une liste

J'ai découvert récemment cette librairie qui permet de lister les packages installés dans un espace de virtualisation et non utilisé dans votre application.

pipenv run pip-autoremove -L

Ainsi on peut nettoyer notre fichier de dépendances en enlevant les librairies souhaitées. L'avantage de cette solution est qu'elle ne dépend pas uniquement de pip, elle fonctionne très bien avec pipenv (que j'utilise)

On peut aussi lister les librairies avec leur version de manière plus lisible pour analyser plus facilement

pipenv run pip-autoremove -L | cut -d' ' -f1,2 | sed 's/ /==/'