前言

最近同学让我帮忙写一个测试网络的工具。由于工作上的事情,断断续续地拖了很久才给出一个相对完整的版本。其实,我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实现网络测试的脚本分享相关推荐

  1. python写一个网络测速脚本_Python实现网络测试的脚本分享详解

    这篇文章主要给大家介绍了关于利用Python实现网络测试的方法,文中给出了详细的示例代码供大家参考学习,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧. 前言 最近同学让我帮忙写一个测试网 ...

  2. python测速程序_利用Python对网站进行测速

    利用python可以编写的用于测试网站访问速率的代码,实现原理是输出打开某url的时间,并计算出访问100次的平均时间,最大时间和最小时间等等.根据时间的变化判断网站速度. 完整代码:import u ...

  3. python爬虫抢火车票_如何用python写一个简单的12306抢票软件|python 爬火车票 教程...

    python 如果抓取验证码图片 类似12306的登录验证码图片 这个以前做次.最大的麻烦是码的识别算法的识别率太低.12306那种网站登陆错3次就限制你20分钟.所以除非你有33%以上的识别率否则不 ...

  4. python自动化测试脚本可以测php吗_利用Python语言实现实验室自动化

    作为一名系统和应用工程师,得益于自动化仪器和软件,我已经节省了不计其数的日日夜夜;例如LabVIEW,这是一款系统设计平台和开发环境,支持可视化编程语言.LabVIEW支持用户利用友好的图形用户界面( ...

  5. 用Python写一个网络爬虫爬取网页中的图片

    写一个爬虫爬取百度贴吧中一个帖子图片 网址:壁纸 用谷歌浏览器的开发工具检查网页,可以发现其每一张图片都有如下格式 <img class="BDE_Image" src=&q ...

  6. python打开一个软件并进行操作_在Python中运行程序(R)以执行操作(执行脚本)的问题...

    我想从 python执行一个R脚本,理想情况下显示和保存结果.使用rpy2有点挣扎,所以我想我只是直接打电话给R.我有一种感觉,我需要使用像"os.system"或"su ...

  7. python写一个完整的小程序_写一个python小程序

    在windows环境下进行操作 window+R 输入cmd  创建一个文件夹 mkdir pytxt 创建一个py文件 py.py  用notepad或者记事本等工具进行编辑 或 首先声明pytho ...

  8. python制作阴阳师脚本_利用python制作一个阴阳师小游戏

    利用python制作一个阴阳师小游戏 发布时间:2020-11-27 13:59:49 来源:亿速云 阅读:84 这期内容当中小编将会给大家带来有关利用python制作一个阴阳师小游戏,文章内容丰富且 ...

  9. python写一个类600行代码_带你领略算法的魅力,一个600行代码的分词功能实现(二)...

    从大学毕业到工作的开始几年,一直觉得大学期间学的线性代数,离散数学,概率论简直是浪费时间. 那时候实际做的代码,大部分都是数据进销存.数据输入到数据库介质中的转换,CS,BS架构都写过一些.总觉得现实 ...

最新文章

  1. c 异步中断服务器连接,异步连接和断开与epoll(Linux)
  2. 5 月书讯 | 程序员的历史课,是时候补补了
  3. java aar 文件,将本地.aar文件添加到我的gradle构建中
  4. hihocoder217周 树形DP
  5. Vue2.0 新手入门 — 从环境搭建到发布
  6. 本科计算机技术与应用知识点,《软件工程》经典考试例题题,重点的知识点(含答案)...
  7. explain是mysql的关键字吗_Mysql Explain 关键字
  8. echarts词云图实现_系统讲解如何用Python制作自己专属的词云图(示例)
  9. mysql提高运行效率_提升Mysql执行效率的SQL优化技巧汇总
  10. Java集成第三方推送(极光推送)——文档篇
  11. 如何将时间字体LED化(类似电子表)显示
  12. android输入法剪切板历史记录,干货分享 讯飞输入法剪切板使用技巧知多少
  13. 如何升级iOS 16正式版?iOS 16正式版一键刷机教程
  14. linux内存占用率高怎么办,Linux下如何解决高内存使用率问题?
  15. 《崩坏3》评测:游戏设计中整体性和利用率分析(下)
  16. 国内拉取 gcr.io 镜像(Google Kubernetes 镜像)
  17. java 字母个数字_Java 中字母对应的数字是多少
  18. CMD常用命令大全(old)
  19. iOS指纹识别(解锁)
  20. LaTeX 制作幻灯片

热门文章

  1. 案例 curd 实体 service serviceimpl mapper mapperimpl
  2. HBase系统架构、Hmaster、HRegionServer、Memstore、storeFile、Region
  3. pc单机版雷电修改器源码
  4. FTPRush.v1.1.219.Unicode-YAG
  5. 课程设计-基于Mysql+java实现的影院管理系统
  6. Spring报错:org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException
  7. 《笨办法学Python》——习题5
  8. 什么是进销存?进销存软件有哪些功能?
  9. 靶机记录(十三):SickOs1.2 - IIS 中 PUT 漏洞的利用
  10. mysql数据库安全性_Mysql数据库的安全性问题释疑