关于图的应用——循环依赖检测(DFS+Python实现)

文章讲述了如何编写一个Python脚本check.py,检查给定测试目录的子目录依赖关系,确保没有缺失或循环依赖。脚本利用深度优先搜索和命令行参数解析来遍历目录,检测并分析依赖问题。

功能要求

假设一个测试目录test,有若干子目录A/B/C。 每个子目录(例如A)中都拥有一个requires文件,requires里每行是子目录名字(例如B),代表此目录的依赖项。编写一个脚本check.py,测试指定子目录中的依赖项是否合理,即是否存在缺失或者循环的依赖关系等(例如A->B->A)。若不合理则需要进行详细分析并打印原因。
执行方式:python check.py -c (folder_name)
图1-功能要求
test目录内容如下图所示:图2-test目录
子目录内容及requests文件内容(以G目录举例),如下图所示:
图3-子目录G
图4-子目录G的requests目录内容

问题分析

  • 首先,涉及到遍历目录,查找依赖,依赖关系是一个比较复杂的,具体来看,A目录依赖于B目录,这是一个单向关系,所以关系具有方向性,结合有向图考虑。
  • 其次,依赖是否存缺失或者循环,是否缺失容易判断,但是在遍历过程中,先要排除环的存在,避免遍历陷入死循环。所以,先判断是否有环,后判断是否有缺失
  • 然后在判断依赖是否有环。可采用图的深度优先搜索拓扑排序算法,以及结合图的矩阵存储来判断。本次用图的深度优先搜索算法进行实现
  • 再者判断依赖是否存在缺失。分为两方面,一方面是依赖文件requests的缺失,另一方面是依赖目录的缺失,这一点在实现时,先将所有子目录名存名放在一个列表中,而后在遍历依赖时*判断依赖的目录是否存在于列表,若不存在则存在缺失*
  • 最后,命令行方式执行。第一步,需要对命令行进行解析;第二步,对输入不正确的命令要捕获异常并给出提示;第三步,根据参数,执行检测功能。

关于环的类型

  • 第一种,顶点本身构成环:
    图5-顶点本身构成环
  • 第二种,所有顶点构成环:图6-所有顶点构成环
  • 第三种,部分顶点构成环:
    图7-部分顶点构成环
  • 特别要注意,下面(图8)这个有向图,不构成环,虽然C、D被访问了多次,很多示例都未解决这个问题。图8-被多次访问但不构成环的有向图

具体实现

  • 需要的库:os ,argparse
    其中,os库用于遍历目录,argparse库用于解析命令行输入的命令,并执行。
  • 在check.py文件中的代码如下:
    注: 我将依赖看做一条路径。N的前驱顶点为:在从X->N->Y的路径上,自X开始访问到该目录N之前,已经发现的依赖目录。这些目录已经形成了一条路径。
import os
import argparse


# 格式化子目录名,用作键
def file(folder):
    return folder.split('/')[-1]


# 获取上级目录名称
def father_file(input_dir, pardir):
    return os.path.abspath(os.path.join(input_dir, pardir))


# 通过requires文件获取依赖关系,建立从A——>B的部分
def build_dependency_graph(folder):
    path = os.path.join(folder, 'requires')
    if not os.path.exists(folder):
        print(f"Error:{
     
     file(folder)}目录未建立")
        return None
    elif os.path.exists(path):
        with open(os.path.join(folder, 'requires'), 'r') 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值