Подтвердить что ты не робот

Создайте граф зависимостей в 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 не существует, каким будет более простой способ выполнить что-то подобное?

Спасибо

4b9b3361

Ответ 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 = "", чтобы их можно было идентифицировать как таковые.