在 python 中构建依赖关系图

Posted

技术标签:

【中文标题】在 python 中构建依赖关系图【英文标题】:Build a dependency graph in python 【发布时间】:2012-12-23 22:01:52 【问题描述】:

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

谢谢

【问题讨论】:

furius.ca/snakefood - 但它似乎只适用于 Python 2。 【参考方案1】:

尝试以下几种之一:

graph-tool networkx igraph

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

networkx 相当不错。

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

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

【讨论】:

谢谢。我认为networkx会绰绰有余!我真的只需要像 Graph.add_edge(A,B) 等那样做。networkx 将为我创建图表。一个问题。我一直在玩它。但是我怎样才能得到依赖列表呢?创建图表后,我会要求 networkx 给我 A:B:C:, H: 恕我直言 igraph 不是用于生物学研究。它适用于任何类型的网络。 感谢@GaborCsardi 的批评。我编辑了我的帖子。 +1 对您的评论进行更正! @Johny19 我不完全确定,我最近一直在使用很多图形库,但事情在我的脑海中搞混了。搜索文档并找到一些示例并从中学习,对您来说应该不难。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

假设您从上面输入的内容是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 = "" 呈现,以便它们被识别出来。

【讨论】:

以上是关于在 python 中构建依赖关系图的主要内容,如果未能解决你的问题,请参考以下文章

python 没有任何额外依赖关系的ipywidgets的文件选择类构建。

Jenkins-job之间依赖关系配置

Dart/Flutter 中的依赖关系图?

Oracle 构建顺序和 PL/SQL 包依赖关系

利用Graphviz绘制逻辑关系依赖图

使用递归查询构建表依赖图