修改含for循环的函数以实现搜索功能(附原始函数代码)
修改函数以在for循环中实现逐个IP的Ping搜索功能
我明白你想要把原来批量执行fping的逻辑改成在for循环里逐个处理每个IP的ping搜索,对吧?我来帮你调整代码,把ping操作放到循环中,让每一次迭代都针对单个IP执行搜索(ping),同时保留原有的结果处理逻辑,还补全了你代码里截断的部分。
修改后的完整代码
import re # 假设get_fping_output和load_devicefile是你已实现的函数 def getpingresults(): iplist = dict(load_devicefile()) pingresults = [] # 遍历每个IP,在循环中实现逐个搜索(ping) for ipaddress in iplist.keys(): print(f'Working on IP: {ipaddress}') # 调整fping命令,仅针对当前IP执行 cmd = f"/usr/sbin/fping -C 3 -A -q {ipaddress}" exitcode, out, results = get_fping_output(cmd) # 处理当前IP的ping结果 for aline in results.split("\n"): if aline: # 匹配fping的输出格式 m = re.match(r"(\S+)\s+:\s(\S+)\s(\S+)\s(\S+)", aline) if m: matched_ip = m.group(1) # 提取三次ping的结果并计算平均rtt rtt_values = [m.group(2), m.group(3), m.group(4)] # 处理ping失败的情况(结果为'-') valid_rtts = [float(val) for val in rtt_values if val != '-'] if valid_rtts: avg_rtt = sum(valid_rtts) / len(valid_rtts) else: avg_rtt = None # 标记所有ping都失败 # 将结果存入iplist(和原逻辑一致) if avg_rtt is not None: iplist[matched_ip] += (avg_rtt,) else: iplist[matched_ip] += (None,) # 收集ping结果到列表 pingresults.append({ 'ip': matched_ip, 'avg_rtt': avg_rtt, 'raw_results': rtt_values }) return pingresults, iplist
关键修改说明
- 循环遍历单个IP:不再一次性把所有IP传给fping,而是在for循环中逐个处理每个IP,实现了循环内的搜索功能
- 调整fping命令:每次只针对当前IP构造fping命令,确保每次循环都是单独的ping操作
- 完善失败处理:原代码里截断的部分我补全了——如果三次ping都失败(结果都是'-'),就把平均rtt设为
None,避免类型错误 - 保留原有逻辑:依然会把结果存入
iplist字典,同时把详细结果收集到pingresults列表中,方便后续使用
内容的提问来源于stack exchange,提问作者saddayz




