如何将Python采集的软件版本信息写入指定结构的version.json文件
你当前输出结构不对的原因是用了字典存储采集结果,而你需要的是由固定结构字典组成的数组,按以下步骤修改即可:
修改步骤
- 替换存储结构
把代码里的data_dict = {}改成data_list = [] - 调整结果写入逻辑
把两个分支里的结果赋值逻辑,替换为往列表中插入符合要求结构的字典:- perl分支的
data_dict[i] = v1_strip替换为
data_list.append({"software": i, "version": v1_strip})- 其他软件分支的
data_dict[i] = v2_strip替换为
data_list.append({"software": i, "version": v2_strip}) - perl分支的
- 优化文件写入逻辑
写入文件建议用w覆盖模式避免旧内容残留,同时把dump的导出对象改成data_list即可。
完整修改后代码
import subprocess as sp, re, json data = ["node", "python3", "ansible", "perl"] ## 可自行添加更多软件 data_list = [] pattern = r'[a-zA-Z]' p_perl = r'\((.*?)\)' def getData(): for i in data: if i == "perl": v1 = sp.run(["perl", "--version"], check=True, stdout=sp.PIPE) v1_decode = v1.stdout.decode('utf-8') v1_name = re.search(p_perl, v1_decode).group(1) v1_name2 = re.sub(pattern, '',v1_name) v1_strip = v1_name2.strip() data_list.append({ "software": i, "version": v1_strip }) else: v2 = sp.run([i, "--version"], check=True, stdout=sp.PIPE) v2_args = sp.run(['head', '-n1'],input=v2.stdout, stdout=sp.PIPE) v2_decode = v2_args.stdout.decode('utf-8') v2_name = re.sub(pattern, '', v2_decode) v2_strip = v2_name.strip() data_list.append({ "software": i, "version": v2_strip }) with open('version.json', 'w', encoding='utf-8') as f: json.dump(data_list, f, indent=4, ensure_ascii=False) if __name__ == '__main__': getData()
最终输出效果
[ { "software": "node", "version": "10.19.0" }, { "software": "python3", "version": "3.8.10" }, { "software": "ansible", "version": "2.9.6" }, { "software": "perl", "version": "5.30.0" } ]
内容的提问来源于stack exchange,提问作者Nembone
相关产品推荐
相关产品推荐

