Python实现网络测试的脚本分享详解
这篇文章主要给大家介绍了关于利用python实现网络测试的方法,文中给出了详细的示例代码供大家参考学习,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
前言
最近同学让我帮忙写一个测试网络的工具。由于工作上的事情,断断续续地拖了很久才给出一个相对完整的版本。其实,我Python用的比较少,所以基本都是边查资料边写程序。
程序的主要逻辑如下:
读取一个excel文件中的ip列表,然后使用多线程调用ping统计每个ip的网络参数,最后把结果输出到excel文件中。
立即学习“Python免费学习笔记(深入)”;
代码如下所示:
#! /usr/bin/env python# -*- coding: UTF-8 -*-# File: pingtest_test.py# Date: 2008-09-28# Author: Michael Field# Modified By:intheworld# Date: 2017-4-17import sysimport osimport getoptimport commandsimport subprocessimport reimport timeimport threadingimport xlrdimport xlwtTEST = [ '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 " %s -n TEST|excel name [-t times of ping] [-c concurrent number(thread nums)]" %sys.argv[0] print " TEST为简单测试的IP列表" print " -t times 测试次数;默认为1000;" print " -c concurrent number 并行线程数目:默认为10" print " -h|-?, 帮助信息" print " 输出为当前目录文件ping_result.txt 和 ping_result.xls" print "for example:" print " ./ping_test.py -n TEST -t 1 -c 10"def p_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 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_returndef 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 <p>这段代码参照了别人的实现,虽然不是特别复杂,这里还是简单解释一下。</p>
excel读写使用了xlrd和xlwt,基本都是使用了一些简单的api。
使用了threading实现多线程并发,和POSIX标准接口非常相似。thread_func是线程的处理函数,它的输入包含了一个ip的List,所以在函数内部通过循环处理各个ip。
此外,Python的commands在Windows下并不兼容,所以使用了subprocess模块。
到目前为止,我对Python里面字符集的理解还不到位,所以正则表达式匹配的代码并不够强壮,不过目前勉强可以工作,以后有必要再改咯!
总结