利用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解析xml模块封装代码
Feb 07 Python
python实现的登陆Discuz!论坛通用代码分享
Jul 11 Python
python getopt详解及简单实例
Dec 30 Python
python机器学习之神经网络(一)
Dec 20 Python
Python之lambda匿名函数及map和filter的用法
Mar 05 Python
python实现爬取百度图片的方法示例
Jul 06 Python
实例详解Python装饰器与闭包
Jul 29 Python
Python 合并多个TXT文件并统计词频的实现
Aug 23 Python
python批量处理文件或文件夹
Jul 28 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
Sep 15 Python
python自动化测试无法启动谷歌浏览器问题
Oct 10 Python
深入浅析Python代码规范性检测
Jul 31 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 adodb分页实现代码
2009/03/19 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
扩展jQuery 键盘事件的几个基本方法
2009/10/30 Javascript
jquery.jstree 增加节点的双击事件代码
2010/07/27 Javascript
JavaScript传递变量: 值传递?引用传递?
2011/02/22 Javascript
防止xss和sql注入:JS特殊字符过滤正则
2013/04/18 Javascript
提取字符串中年月日的函数代码
2013/11/05 Javascript
javascript HTML+CSS实现经典橙色导航菜单
2016/02/16 Javascript
浅析Bootstrap缩略图组件与警示框组件
2016/04/29 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
2016/05/17 Javascript
纯JS实现可拖拽表单的简单实例
2016/09/02 Javascript
如何利用模板将HTML从JavaScript中抽离
2016/10/08 Javascript
webpack+vue.js快速入门教程
2016/10/12 Javascript
jquery滚动条插件(可以自定义)
2016/12/11 Javascript
JS中闭包的经典用法小结(2则示例)
2016/12/28 Javascript
微信小程序wxs实现吸顶效果
2020/01/08 Javascript
vue@cli3项目模板怎么使用public目录下的静态文件
2020/07/07 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
[01:20:37]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python远程登录代码
2008/04/29 Python
Python文件操作基本流程代码实例
2017/12/11 Python
python梯度下降法的简单示例
2018/08/31 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
DataFrame 数据合并实现(merge,join,concat)
2020/06/14 Python
python绘图模块之利用turtle画图
2021/02/12 Python
html5实现完美兼容各大浏览器的播放器
2014/12/26 HTML / CSS
三星英国官网:Samsung英国
2018/09/25 全球购物
SHEIN美国:购买时髦的女性服装
2020/12/02 全球购物
《陋室铭》教学反思
2014/02/26 职场文书
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
劳动保障个人工作总结
2015/03/04 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书
教你怎么用Python监控愉客行车程
2021/04/29 Python
MySQL 数据 data 基本操作
2022/05/04 MySQL
springcloud整合seata
2022/05/20 Java/Android