web-dev-qa-db-fra.com

Construire un graphe de dépendance en python

Je me demandais si python a une bibliothèque intégrée (ou une bibliothèque sur le réseau ...) Cela va créer pour moi un graphique de dépendances? J'ai un fichier formaté comme ça

A::Requires         = ""
B::Requires     = A
C::Requires     = B
H::Requires     = A

AA::Requires         = ""
BB::Requires         = AA
C::Requires     = B

CC::Requires    = BB

Idéalement, j'aimerais avoir quelque chose comme un arbre comme ça:

A
 +-B
   +-C
 +-H

AA
 +-BB
   +-CC

Donc, fondamentalement, une bibliothèque où je fournirai un tuple (A, B) ou (A, H) et qui construira l’arbre pour moi? Si une telle bibliothèque n’existe pas, quel serait le moyen le plus facile accomplir quelque chose comme ça?

Je vous remercie

15
Johny19

Essayez avec l'un des nombreux:

graph-tool est très difficile à installer (il faut beaucoup de mémoire pour la compilation, je pense que c'était environ 5 Go de RAM et environ 12 heures de compilation).

networkx est assez décent.

igraph citation de leur page: igraph est un progiciel gratuit pour la création et la manipulation de graphes non orientés et dirigés. Il inclut des implémentations pour les problèmes classiques de la théorie des graphes tels que l’espacement minimal et le flux de réseau, ainsi que des algorithmes pour certaines méthodes d'analyse de réseau récentes, telles que la recherche de structure de communauté.

Je les utilise tous. Cela dépend vraiment de ce dont vous avez besoin. Si vous en avez besoin pour quelque chose d'aussi simple que des dépendances, le type d'utilisation que vous allez utiliser n'a pas d'importance, cependant, je vous recommanderais d'utiliser un outil graphique si vous en avez besoin pour quelque chose de plus court et de plus léger.

13
Belphegor

En supposant que votre entrée ci-dessus est donnée sous forme de chaîne dans raw:

import networkx as nx
import re

regex = re.compile(r'^([A-Z]+)::Requires\s+=\s([A-Z"]+)$')

G = nx.DiGraph()
roots = set()
for l in raw.splitlines():
    if len(l):
        target, prereq = regex.match(l).groups()
        if prereq == '""':
            roots.add(target)
        else:
            G.add_Edge(prereq, target)

Maintenant, imprimez les arbres:

for s in roots:
    print s
    spacer = {s: 0}
    for prereq, target in nx.dfs_edges(G, s):
        spacer[target] = spacer[prereq] + 2
        print '{spacer}+-{t}'.format(
                                     spacer=' ' * spacer[prereq],
                                     t=target)
    print ''

ceci imprime:

A
+-H
+-B
  +-C

AA
+-BB
  +-CC

Cela nécessite que all roots soit présenté par root::Requires = "" pour pouvoir être identifié comme tel.

15
Theodros Zelleke

Graphviz est idéal pour la construction automatisée de documentation de dépendances. 

Il existe également une bibliothèque utile Python appelée pygraphviz

J'utilise ceci pour créer une carte de dépendance, puis une sortie sous forme de texte et sous forme de visuel qui exporte automatiquement au format PDF.