You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

修改含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

火山引擎 最新活动