我被赋予了编写程序的任务,该程序将处理构建系统的一些配方。这些配方包括依赖项信息。解析所有食谱后,我有一个字典,其中的键是软件包的名称,值是每个直接所依赖的软件包的名称列表。这是此类词典的示例。
{
'oprofile':[
'popt',
'binutils'
],
'qtbuildtools':[
],
'boost-1.65.1':[
],
'boost':[
'bjam-native',
'zlib',
'bzip2'
],
'libuv':[
],
'lvm2':[
'util-linux'
],
'swupdate':[
'libconfig',
'kern-tools-native'
],
'swupdate_tools':[
],
'pdd':[
'mosquitto',
'sqlite3',
'openssl'
]
}
我想做的是编写一个函数,该函数将该字典作为输入,然后生成一个类似的字典,但是值将包含,而不仅仅是 direct 依赖项所有每个软件包的依赖项。
这是我为实现目标而完成的解决方案。据我所知,至少不是很好。我想改善它,或者甚至完全走我自己看不见的其他方式。
def _dependencies(bb_files, bb_names):
dep_pairs = []
i = 0
for file in captured_files:
bbfn = file
i = i + 1
with open(captured_files.get(file), encoding="utf-8") as bbfile:
recipe_cont = bbfile.readlines()
depes = []
for rec_line in recipe_cont:
if rec_line.startswith('DEPENDS'):
depes = re.sub(r'["\t\n\r\f\v]', '', rec_line.split('=')[1])
depes = depes.strip()
depes = re.split(' ', depes)
for dep in depes:
if '\\' or '\\\\' or '$' or '${' or '}' or '/' or '"' in dep:
depes.pop(depes.index(dep))
pair = tuple([bbfn, list(set(depes))])
dep_pairs.append(pair)
pairs_dict = dict(dep_pairs)
return pairs_dict
def _all_deps_to_build(to_build, all_deps):
big_list = []
rec_list = to_build
for i in itertools.count():
rec_list1 = []
for rec in rec_list:
for key in all_deps:
if rec in all_deps.get(key):
rec_list1.append(key)
elif re.sub(r'\..*', '', re.sub(r'_.*', '', rec)) in all_deps.get(key):
rec_list1.append(key)
if len(rec_list1) == 0:
break
else:
big_list.extend(rec_list1)
rec_list = rec_list1
big_list = set(big_list) # set() используется для удаления повторов из списка
return big_list
小解释:_all_deps-to_build()将_dependencies()的输出作为其all_deps输入变量,而to_build只是软件包的简单列表。
我主要关心的是第二个功能。我正在使用itertools,所有这些其他列表似乎都不是正确的方法。