Построение графика зависимостей в python

мне было интересно, есть ли у python встроенная библиотека (или любая библиотека в сети..) Что создаст для меня график зависимостей ? У меня есть файл в таком формате

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

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

CC::Requires    = BB

в идеале я хотел бы иметь что-то вроде такого дерева:

A
 +-B
   +-C
 +-H

AA
 +-BB
   +-CC

Итак, в основном lib, где я предоставлю кортеж (A,B) или (A, H), и он построит дерево для меня? Если такой lib не существует, каков был бы более простой способ выполнить что-то вроде это?

спасибо

3 ответов


попробуйте с одним из нескольких:

graph-tool очень сложно установить (для компиляции требуется много памяти, я думаю, что это было около 5 ГБ ОЗУ и около 12 часов компиляции).

networkx довольно приличный.

графика цитата из их страница:igraph-это бесплатный программный пакет для создания и управления неориентированными и направленными графами. Он включает в себя реализации для классических задач теории графов, таких как минимальные охватывающие деревья и сетевой поток, а также реализует алгоритмы для некоторых последних методов сетевого анализа, таких как поиск структуры сообщества.

Я использовал их все. Это действительно зависит от того, что именно вам нужно. Если они нужны вам для чего-то простого, Как зависимости, то это на самом деле не важно, какой из них вы собираетесь использовать, я бы рекомендовал вам avoud graph-tool, если вам это нужно для чего-то более короткого и легкого.


предполагая, что ваш ввод сверху задан как строка в 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)

теперь распечатайте дерево (ы):

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

печатается:

A
+-H
+-B
  +-C

AA
+-BB
  +-CC

для этого все корни представлены через root::Requires = "" для того, чтобы их можно было идентифицировать как таковые.


Graphviz отлично подходит для создания документации зависимостей в автоматическом режиме.

есть полезная библиотека Python тоже называется pygraphviz

Я использую это для создания карты зависимостей, а затем вывода в текстовой форме и как визуальный, который автоматически экспортируется в PDF.