修复Python ping脚本IndexError报错 支持命令行运行
Python Ping脚本索引越界报错修复
报错根因
触发IndexError: list index out of range的核心问题有4个:
- 正则规则错误:原代码用
r'time \w+'匹配延迟字段,但实际ping返回的延迟格式为time=xx.x ms,等号、浮点数小数点不在\w(仅匹配字母、数字、下划线)的匹配范围内,即使输出包含"time"字符串,正则也会返回空列表,直接取索引0就会触发越界。 - 边界场景无兜底:读取host列表时未去除行尾换行符,可能导致ping命令参数异常;ping完全失败时IP匹配结果可能为空,直接取
dns[0]也会触发同类越界;文件打开后未手动关闭,存在资源泄漏。 - 判断逻辑不严谨:仅通过字符串是否包含"time"判定匹配成功,未校验正则实际返回结果。
- 隐藏匹配bug:IP匹配正则中的
.未转义,会匹配任意字符,可能匹配到非IP格式的错误内容。
修复后完整代码
import subprocess import re def main(): print('IP, TimeToPing (ms)') # 上下文管理器自动处理文件关闭,避免资源泄漏 with open('pingfile.txt', 'r', encoding='utf-8') as f: for host in f.readlines(): # 去除行尾换行、首尾空格 host = host.strip() # 跳过文件中的空行 if not host: continue # 执行ping命令:macOS/Linux参数为 -c 发包数 -t 超时秒数,Windows环境请将-t改为-w ping_output = subprocess.getoutput(f"ping -c 1 -t 2 {host}") # 转义正则中的.,正确匹配IPv4地址 ip_res = re.findall(r'\d+\.\d+\.\d+\.\d+', ping_output) # IP匹配失败时兜底用输入的host/域名展示,避免越界 target_ip = ip_res[0] if ip_res else host # 兼容time=xx ms、time: xx.x ms等不同返回格式,直接提取延迟数值 time_res = re.findall(r'time[=:]\s*([\d.]+)\s*ms', ping_output) ping_delay = f"{time_res[0]} ms" if time_res else "NotFound" print(f"{target_ip}, {ping_delay}") if __name__ == "__main__": main()
运行说明
- 将需要检测的IP、域名逐行写入和脚本同目录的
pingfile.txt文件 - 命令行进入脚本所在目录,执行
python3 ping2.py即可正常运行 - 如果是Windows系统运行,将代码中ping命令的
-t 2参数改为-w 2000即可(Windows下ping的-w参数单位为毫秒)
内容的提问来源于stack exchange,提问作者user19099651
相关产品推荐
相关产品推荐

