Python -Comment mieux gérer ses dépendances en python
21 oct. 2020
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.
Il faut installer la librairie python pipdeptree et lancer la génération de l'arbre de vos dépendances
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
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
Et on génère l'image du graphe
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.

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)
Ainsi on connait les dépendances non inscrites dans le setup.py ou requirements.txt
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.
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
blog comments powered by Disqus
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.

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/ /==/'