22 votes

Arbre des dépendances des packages Python

Je voudrais analyser l'arbre de dépendance des packages Python. Comment puis-je obtenir ces données ?

Choses que je sais déjà

  1. setup.py contient parfois un champ requires qui liste les dépendances des packages
  2. PyPi est un dépôt en ligne de packages Python
  3. PyPi a une API

Choses que je ne sais pas

  1. Très peu de projets (environ 10 %) sur PyPi listent explicitement les dépendances dans le champ requires mais pip/easy_install parvient quand même à télécharger les bons packages. Qu'est-ce qui m'échappe ? Par exemple, la bibliothèque populaire pour le calcul statistique, pandas, ne liste pas requires mais parvient quand même à installer numpy, pytz, etc.... Existe-t-il un meilleur moyen de collecter automatiquement la liste complète des dépendances ?
  2. Existe-t-il une base de données préexistante quelque part ? Est-ce que je répète un travail déjà existant ?
  3. Est-ce que des bases de données similaires et facilement accessibles existent pour d'autres langages avec des systèmes de distribution (R, Clojure, etc... ?)

19voto

Martijn Pieters Points 271458

Vous devriez examiner le champ install_requires à la place, voir Nouveaux et modifiés mots-clés setup.

nécessite est considéré comme un champ trop vague pour compter sur l'installation de dépendances. De plus, il existe les champs setup_requires et test_requires pour les dépendances requises pour setup.py et pour l'exécution de tests.

Certes, le graphe des dépendances a déjà été analysé; de cet article de blog d'Olivier Girardot vient cette image fantastique:

Dépendances PyPI
L'image est liée à la version interactive du graphe.

1voto

vartec Points 53382

En utilisant des outils comme pip, vous pouvez répertorier toutes les exigences pour chaque package.

La commande est :

pip install --no-install nom_du_package

Vous pouvez réutiliser une partie de pip dans votre script. La partie responsable de l'analyse des exigences est le module pip.req.

1voto

radtek Points 506

Voici comment vous pouvez le faire de manière programmable en utilisant le paquet python pip:

from pip._vendor import pkg_resources  # Assurez-vous que l'index-url de pip pointe vers le vrai index PyPi

# Obtenir les dépendances de pip
nom_du_paquet = 'Django'
try:
    package_resources = pkg_resources.working_set.by_key[nom_du_paquet.lower()] # Lance une KeyError si non trouvé
    dépendances = package_resources._dep_map.keys() + ([str(r) for r in package_resources.requires()])
    dépendances = list(set(dépendances))
except KeyError:
    dépendances = []

Et voici comment vous pouvez obtenir les dépendances à partir de l'API PyPi :

import requests
import json
nom_du_paquet = 'Django'
# URL d'information sur le paquet
PYPI_API_URL = 'https://pypi.python.org/pypi/{package_name}/json'
url_details_paquet = PYPI_API_URL.format(package_name=nom_du_paquet)
réponse = requests.get(url_details_paquet)
données = json.loads(réponse.content)
if réponse.status_code == 200:
    dépendances = données['info'].get('requires_dist')
    dépendances2 = données['info'].get('requires')
    dépendances3 = données['info'].get('setup_requires')
    dépendances4 = données['info'].get('test_requires')
    dépendances5 = données['info'].get('install_requires')
    if dépendances2:
        dépendances.extend(dépendances2)
    if dépendances3:
        dépendances.extend(dépendances3)
    if dépendances4:
        dépendances.extend(dépendances4)
    if dépendances5:
        dépendances.extend(dépendances5)
    dépendances = list(set(dépendances))

Vous pouvez utiliser la récursivité pour appeler les dépendances des dépendances afin d'obtenir l'arborescence complète. Santé!

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