You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取每次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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:21:21