如何提取每次ping结果中的Average值并存储到文件
问题说明
已实现批量读取IP列表执行ping操作的功能,但现有代码仅能获取ping命令的执行返回码,无法提取结果中的Average(平均时延)值,原有代码如下:
import subprocess import threading ip_list = [] def ping(host): ip_list.append(host+ ' '+ str((subprocess.run('ping '+host +' -n 1').returncode))) with open(r'input.txt', "r") as input_file: hosts = input_file.read() hosts_list =hosts.split('\n') num_threads = 1 number = 0 while number< len(hosts_list): for i in range(num_threads): t = threading.Thread(target=ping, args=(hosts_list[number+i],)) t.start() t.join() number = number +1
问题根因
原有代码调用subprocess.run时未捕获ping命令的标准输出内容,仅读取了进程返回码(仅能判断IP是否可达),没有可解析的输出文本自然无法提取Average字段。
修复实现
需要做3处核心调整:
- 调用
subprocess.run时增加capture_output=True, text=True参数,拿到ping命令的完整文本输出 - 通过正则表达式匹配输出中的Average时延值,兼容中英文Windows系统的输出格式
- 补全异常判断,ping不通时无Average字段需做标记,同时修正空行、线程越界的潜在问题
修改后可直接运行的代码:
import subprocess import threading import re ip_list = [] def ping(host): # 执行ping命令,捕获标准输出 ping_result = subprocess.run(f'ping {host} -n 1', capture_output=True, text=True) avg_delay = "N/A" # 连通成功才尝试提取平均时延 if ping_result.returncode == 0: # 兼容中英文系统输出:英文匹配Average = xxms,中文匹配平均 = xxms time_match = re.search(r'(?:Average|平均)\s*=\s*(\d+)\s*ms', ping_result.stdout) if time_match: avg_delay = f"{time_match.group(1)}ms" ip_list.append(f"IP: {host} 连通状态: {'可达' if ping_result.returncode == 0 else '不可达'} 平均时延: {avg_delay}") with open(r'input.txt', "r") as input_file: hosts = input_file.read() # 过滤空行、去掉每行首尾空白字符 hosts_list = [h.strip() for h in hosts.split('\n') if h.strip()] # 按需调整并发线程数 num_threads = 1 current_idx = 0 while current_idx < len(hosts_list): thread_pool = [] # 控制单次启动的线程数,避免索引越界 for i in range(num_threads): if current_idx + i >= len(hosts_list): break t = threading.Thread(target=ping, args=(hosts_list[current_idx+i],)) t.start() thread_pool.append(t) # 等待当前批次所有线程执行完成 for t in thread_pool: t.join() current_idx += num_threads # 打印结果示例 for item in ip_list: print(item)
补充说明
- 如果是Linux/macOS系统,ping命令的输出格式和Windows有差异,正则规则需要调整为匹配
rtt min/avg/max/mdev = \d+\.\d+/(\d+\.\d+)/\d+\.\d+/\d+\.\d+ ms格式提取avg值 - 若需要更准确的时延结果,可以把ping的
-n参数改大,比如-n 4发4个包取平均,结果参考性更强
内容的提问来源于stack exchange,提问作者Ratna Raju
相关产品推荐
相关产品推荐

