Построение графика зависимостей в 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.