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

test目录内容如下图所示:
子目录内容及requests文件内容(以G目录举例),如下图所示:


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

- 第二种,所有顶点构成环:

- 第三种,部分顶点构成环:

- 特别要注意,下面(图8)这个有向图,不构成环,虽然C、D被访问了多次,很多示例都未解决这个问题。

具体实现
- 需要的库: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')

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

被折叠的 条评论
为什么被折叠?



