在python中构建依赖图

时间:2013-01-09 16:54:25

标签: python graph dependencies

我想知道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 个答案:

答案 0 :(得分:15)

假设您在上面的输入是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 = ""呈现,以便将其标识为。

答案 1 :(得分:13)

尝试使用其中一种:

图形工具非常难以安装(它需要大量的内存用于编译,我认为它大约有5GB的RAM和大约12小时的编译时间。)

networkx 非常不错。

igraph 引用他们的网页: igraph是一个免费的软件包,用于创建和操作无向和有向图。它包括经典图形理论问题的实现,如最小生成树和网络流,并且还实现了一些最近的网络分析方法的算法,如社区结构搜索。

我一直在使用它们。这实际上取决于你究竟需要什么。如果你需要它们用于像依赖项一样简单的东西,那么你要使用哪一个并不重要,不过,如果你需要更短更轻的东西,我会建议你使用avoud graph-tool。

答案 2 :(得分:0)

Graphviz非常适合以自动方式构建依赖项文档。

有一个有用的Python库,名为pygraphviz

我使用它来构建依赖关系图,然后以文本形式输出,并作为自动导出为PDF的视觉输出。