利用Python实现网络测试的脚本分享
发布时间 - 2026-01-11 01:22:36 点击率:次前言

最近同学让我帮忙写一个测试网络的工具。由于工作上的事情,断断续续地拖了很久才给出一个相对完整的版本。其实,我Python用的比较少,所以基本都是边查资料边写程序。
程序的主要逻辑如下:
读取一个excel文件中的ip列表,然后使用多线程调用ping统计每个ip的网络参数,最后把结果输出到excel文件中。
代码如下所示:
#! /usr/bin/env python
# -*- coding: UTF-8 -*-
# File: pingtest_test.py
# Date: 2008-09-28
# Author: Michael Field
# Modified By:intheworld
# Date: 2017-4-17
import sys
import os
import getopt
import commands
import subprocess
import re
import time
import threading
import xlrd
import xlwt
TEST = [
'220.181.57.217',
'166.111.8.28',
'202.114.0.242',
'202.117.0.20',
'202.112.26.34',
'202.203.128.33',
'202.115.64.33',
'202.201.48.2',
'202.114.0.242',
'202.116.160.33',
'202.202.128.33',
]
RESULT={}
def usage():
print "USEAGE:"
print "\t%s -n TEST|excel name [-t times of ping] [-c concurrent number(thread nums)]" %sys.argv[0]
print "\t TEST为简单测试的IP列表"
print "\t-t times 测试次数;默认为1000;"
print "\t-c concurrent number 并行线程数目:默认为10"
print "\t-h|-?, 帮助信息"
print "\t 输出为当前目录文件ping_result.txt 和 ping_result.xls"
print "for example:"
print "\t./ping_test.py -n TEST -t 1 -c 10"
def div_list(ls,n):
if not isinstance(ls,list) or not isinstance(n,int):
return []
ls_len = len(ls)
print 'ls length = %s' %ls_len
if n<=0 or 0==ls_len:
return []
if n > ls_len:
return []
elif n == ls_len:
return [[i] for i in ls]
else:
j = ls_len/n
k = ls_len%n
### j,j,j,...(前面有n-1个j),j+k
#步长j,次数n-1
ls_return = []
for i in xrange(0,(n-1)*j,j):
ls_return.append(ls[i:i+j])
#算上末尾的j+k
ls_return.append(ls[(n-1)*j:])
return ls_return
def pin(IP):
try:
xpin=subprocess.check_output("ping -n 1 -w 100 %s" %IP, shell=True)
except Exception:
xpin = 'empty'
ms = '=[0-9]+ms'.decode("utf8")
print "%s" %ms
print "%s" %xpin
mstime=re.search(ms,xpin)
if not mstime:
MS='timeout'
return MS
else:
MS=mstime.group().split('=')[1]
return MS.strip('ms')
def count(total_count,I):
global RESULT
nowsecond = int(time.time())
nums = 0
oknums = 0
timeout = 0
lostpacket = 0.0
total_ms = 0.0
avgms = 0.0
maxms = -1
while nums < total_count:
nums += 1
MS = pin(I)
print 'pin output = %s' %MS
if MS == 'timeout':
timeout += 1
lostpacket = timeout*100.0 / nums
else:
oknums += 1
total_ms = total_ms + float(MS)
if oknums == 0:
oknums = 1
maxms = float(MS)
avgms = total_ms / oknums
else:
avgms = total_ms / oknums
maxms = max(maxms, float(MS))
RESULT[I] = (I, avgms, maxms, lostpacket)
def thread_func(t, ipList):
if not isinstance(ipList,list):
return
else:
for ip in ipList:
count(t, ip)
def readIpsInFile(excelName):
data = xlrd.open_workbook(excelName)
table = data.sheets()[0]
nrows = table.nrows
print 'nrows %s' %nrows
ips = []
for i in range(nrows):
ips.append(table.cell_value(i, 0))
print table.cell_value(i, 0)
return ips
if __name__ == '__main__':
file = 'ping_result.txt'
times = 10
network = ''
thread_num = 10
args = sys.argv[1:]
try:
(opts, getopts) = getopt.getopt(args, 'n:t:c:h?')
except:
print "\nInvalid command line option detected."
usage()
sys.exit(1)
for opt, arg in opts:
if opt in ('-n'):
network = arg
if opt in ('-h', '-?'):
usage()
sys.exit(0)
if opt in ('-t'):
times = int(arg)
if opt in ('-c'):
thread_num = int(arg)
f = open(file, 'w')
workbook = xlwt.Workbook()
sheet1 = workbook.add_sheet("sheet1", cell_overwrite_ok=True)
if not isinstance(times,int):
usage()
sys.exit(0)
if network not in ['TEST'] and not os.path.exists(os.path.join(os.path.dirname(__file__), network)):
print "The network is wrong or excel file does not exist. please check it."
usage()
sys.exit(0)
else:
if network == 'TEST':
ips = TEST
else:
ips = readIpsInFile(network)
print 'Starting...'
threads = []
nest_list = div_list(ips, thread_num)
loops = range(len(nest_list))
print 'Total %s Threads is working...' %len(nest_list)
for ipList in nest_list:
t = threading.Thread(target=thread_func,args=(times,ipList))
threads.append(t)
for i in loops:
threads[i].start()
for i in loops:
threads[i].join()
it = 0
for line in RESULT:
value = RESULT[line]
sheet1.write(it, 0, line)
sheet1.write(it, 1, str('%.2f'%value[1]))
sheet1.write(it, 2, str('%.2f'%value[2]))
sheet1.write(it, 3, str('%.2f'%value[3]))
it+=1
f.write(line + '\t'+ str('%.2f'%value[1]) + '\t'+ str('%.2f'%value[2]) + '\t'+ str('%.2f'%value[3]) + '\n')
f.close()
workbook.save('ping_result.xls')
print 'Work Done. please check result %s and ping_result.xls.'%file
这段代码参照了别人的实现,虽然不是特别复杂,这里还是简单解释一下。
- excel读写使用了xlrd和xlwt,基本都是使用了一些简单的api。
- 使用了threading实现多线程并发,和POSIX标准接口非常相似。thread_func是线程的处理函数,它的输入包含了一个ip的List,所以在函数内部通过循环处理各个ip。
- 此外,Python的commands在Windows下并不兼容,所以使用了subprocess模块。
到目前为止,我对Python里面字符集的理解还不到位,所以正则表达式匹配的代码并不够强壮,不过目前勉强可以工作,以后有必要再改咯!
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# python
# 测试网络连接
# 性能测试
# python自动化测试
# Python测试网络连通性示例【基于ping】
# python网络爬虫精解之Beautiful Soup的使用说明
# python网络通信图文详解
# 详解python网络进程
# Python实现一个简单三层神经网络的搭建及测试 代码解析
# 都是
# 使用了
# 多线程
# 默认为
# 让我
# 还不
# 我对
# 很久
# 这段
# 所示
# 这篇文章
# 谢谢大家
# 工作上
# 比较少
# 要再
# 拖了
# 包含了
# 有疑问
# 正则表达式
# RESULT
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速使用云服务器搭建个人网站?
,交易猫的商品怎么发布到网站上去?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
如何快速搭建高效简练网站?
如何在万网自助建站中设置域名及备案?
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
大连 网站制作,大连天途有线官网?
Android Socket接口实现即时通讯实例代码
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Laravel如何实现API速率限制?(Rate Limiting教程)
Laravel如何生成URL和重定向?(路由助手函数)
如何快速启动建站代理加盟业务?
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
如何用低价快速搭建高质量网站?
HTML 中动态设置元素 name 属性的正确语法详解
利用 Google AI 进行 YouTube 视频 SEO 描述优化
浅述节点的创建及常见功能的实现
高端网站建设与定制开发一站式解决方案 中企动力
JS中对数组元素进行增删改移的方法总结
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Laravel如何使用.env文件管理环境变量?(最佳实践)
Python3.6正式版新特性预览
如何在阿里云虚拟服务器快速搭建网站?
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
微信h5制作网站有哪些,免费微信H5页面制作工具?
如何在IIS中新建站点并配置端口与物理路径?
如何在万网自助建站平台快速创建网站?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
html5的keygen标签为什么废弃_替代方案说明【解答】
Laravel如何处理文件下载请求?(Response示例)
北京专业网站制作设计师招聘,北京白云观官方网站?
JavaScript如何实现错误处理_try...catch如何捕获异常?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
php json中文编码为null的解决办法
Android GridView 滑动条设置一直显示状态(推荐)
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
Laravel如何使用withoutEvents方法临时禁用模型事件
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
详解vue.js组件化开发实践
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
高端建站三要素:定制模板、企业官网与响应式设计优化
Laravel如何使用模型观察者?(Observer代码示例)

