Создайте граф зависимостей в 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
Итак, в основном A lib, где я предоставил кортеж (A, B) или (A, H), и он будет строить дерево для меня?
Если такой lib не существует, каким будет более простой способ выполнить что-то подобное?
Спасибо
Ответы
Ответ 1
Попробуйте один из нескольких:
графический инструмент очень сложно установить (для компиляции требуется много памяти, я думаю, что это было около 5 ГБ ОЗУ и около 12 часов компиляции).
networkx довольно приличный.
igraph цитата со своей страницы: igraph - это бесплатный пакет программного обеспечения для создания и управления неориентированными и направленными графиками. Он включает в себя реализации для классических задач теории графов, таких как минимальные связующие деревья и сетевой поток, а также реализует алгоритмы для некоторых недавних методов сетевого анализа, таких как поиск структуры сообщества.
Я использовал их все. Это действительно зависит от того, что именно вам нужно. Если вам нужны они для чего-то такого же простого, как зависимости, то действительно не важно, какой из них вы собираетесь использовать, хотя я бы рекомендовал вам использовать графический инструмент avoud, если вам это нужно для чего-то более короткого и легкого.
Ответ 2
Предполагая, что ваш ввод сверху указан как строка в 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 = ""
, чтобы их можно было идентифицировать как таковые.