利用Python实现网络测试的脚本分享


Posted in Python onMay 26, 2017

前言

最近同学让我帮忙写一个测试网络的工具。由于工作上的事情,断断续续地拖了很久才给出一个相对完整的版本。其实,我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使用urllib模块的urlopen超时问题解决方法
Nov 08 Python
深入讲解Java编程中类的生命周期
Feb 05 Python
使用Python3制作TCP端口扫描器
Apr 17 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
Apr 05 Python
Python基于jieba库进行简单分词及词云功能实现方法
Jun 16 Python
基于python3实现socket文件传输和校验
Jul 28 Python
Django Python 获取请求头信息Content-Range的方法
Aug 06 Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 Python
python安装virtualenv虚拟环境步骤图文详解
Sep 18 Python
Django框架反向解析操作详解
Nov 28 Python
Python自动化之批量处理工作簿和工作表
Jun 03 Python
Python调用腾讯API实现人脸身份证比对功能
Apr 04 Python
python 如何快速找出两个电子表中数据的差异
May 26 #Python
详解Python3操作Mongodb简明易懂教程
May 25 #Python
python爬虫入门教程--正则表达式完全指南(五)
May 25 #Python
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
May 25 #Python
Python win32com 操作Exce的l简单方法(必看)
May 25 #Python
python win32 简单操作方法
May 25 #Python
python爬虫入门教程--利用requests构建知乎API(三)
May 25 #Python
You might like
PHP批量生成缩略图的代码
2008/07/19 PHP
PHP中extract()函数的定义和用法
2012/08/17 PHP
php数组中包含中文的排序方法
2014/06/03 PHP
php实现的替换敏感字符串类实例
2014/09/22 PHP
PHP通过插入mysql数据来实现多机互锁实例
2014/11/05 PHP
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
基于jquery的鼠标拖动效果代码
2012/05/30 Javascript
Jquery实现带动画效果的经典二级导航菜单
2013/03/22 Javascript
jquery中的事件处理详细介绍
2013/06/24 Javascript
js控制不同的时间段显示不同的css样式的实例代码
2013/11/04 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
2014/05/05 Javascript
js+html5通过canvas指定开始和结束点绘制线条的方法
2015/06/05 Javascript
JS实现的另类手风琴效果网页内容切换代码
2015/09/08 Javascript
jQuery实现表格奇偶行显示不同背景色 就这么简单
2017/03/13 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
Vue.js组件间的循环引用方法示例
2017/12/27 Javascript
在vue项目中使用element-ui的Upload上传组件的示例
2018/02/08 Javascript
vue如何通过id从列表页跳转到对应的详情页
2018/05/01 Javascript
微信小程序 swiper 组件遇到的问题及解决方法
2019/05/26 Javascript
Python实现HTTP协议下的文件下载方法总结
2016/04/20 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
python编写微信公众号首图思路详解
2019/12/13 Python
tensorflow 模型权重导出实例
2020/01/24 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
生日邀请函范文
2014/01/13 职场文书
教师节活动主持词
2014/04/02 职场文书
先进工作者申报材料
2014/12/23 职场文书
成品仓管员岗位职责
2015/04/01 职场文书
汽车修理厂管理制度
2015/08/05 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书
会计入职心得体会
2016/01/22 职场文书
自考生自我评价
2019/06/21 职场文书
python 模拟在天空中放风筝的示例代码
2021/04/21 Python