23

我想知道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,B) 或 (A,H),它会为我构建树吗?如果这样的库不存在,那么完成类似事情的更简单方法是什么?

谢谢

4

3 回答 3

20

假设您从上面的输入作为字符串给出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 = "",以便它们被识别出来。

于 2013-01-09T18:47:12.077 回答
16

尝试以下几种之一:

graph-tool很难安装(它需要大量内存进行编译,我认为它大约有 5GB 的 RAM 和大约 12 小时的编译时间)。

networkx相当不错。

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

我一直在使用它们。这真的取决于你到底需要什么。如果您需要它们来处理依赖项等简单的事情,那么您将使用哪个并不重要,但是,如果您需要更短更轻的东西,我建议您避免使用 graph-tool。

于 2013-01-09T17:06:08.337 回答
3

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

也有一个有用的 Python 库,称为pygraphviz

我用它来建立一个依赖关系图,然后以文本形式和自动导出为 PDF 的视觉效果输出。

于 2018-03-08T13:42:22.650 回答