python中使用psutil和matplotlib绘制监控cpu消耗图

一般的自动化测试中都会有这样一个需求,就是需要监控设备资源利用率并输出
那我们就来分析下这个需求
1.监控资源(linux环境有命令查看,也有专门的位置取存放信息)
2.输出图标(python的数据可视化)
那我就来简单介绍下这次使用到的psutil和matplotlib库
一.psutil模块
python获取系统信息的渠道有很多,如内置的Subprocess模块,os.popen()和os.popen(cmd).read()方法
不过他们都需要解析返回的大量信息,
使用psutil就很简单了,它有封装的方法是帮你解析好的
(1)获取CPU信息:使用psutil.cpu_times()获取CPU的完整信息

import psutil
print(psutil.cpu_times())
>>>>scputimes(user=5681.026016599999, system=1444.0388566000001, idle=11999.59692, interrupt=90.9641831, dpc=205.5625177)

(2)获取内存信息:使用psutil.virtual_memory() 获取系统内存的使用情况;

print(psutil.virtual_memory())
svmem(total=8553431040, available=4593131520, percent=46.3, used=3960299520, free=4593131520)

psutil.swap_memory()获取系统交换内存的统计信息

print(psutil.swap_memory())
svmem(total=8553431040, available=4593131520, percent=46.3, used=3960299520, free=4593131520)

剩下的我会针对进程来说

1.psutil.pids()获取所有进程号(列表)
2.p = psutil.Process(进程号) 
p.name()#获取该进程的进程名
p.cpu_times()#该进程所有cpu信息,为元组
p.memory_info()#该进程所有内存信息,为元组

剩下的信息,可以自己去了解下,以下为源码的索引地址,包括返回值的内容都有介绍
https://github.com/giampaolo/psutil/blob/master/docs/index.rst
二.matplotlib模块
现在关于数据可视化这块也有matplotlib和Pyecharts这2种,下一次会写篇文字专门介绍他们的不同
matplotlib模块核心代码很简单,所以使用范围很广,但是matplotlib是可以玩出花活的,大致为散点的
形状和颜色,还有画布的一些设置(当然涉及numpy复杂的数学画图那就比较麻烦了)
matplotlib主要画图代码,一般就用到下面这些

import matplotlib.pyplot as plt
import psutil
plt.rcParams['font.sans-serif']=['SimHei']  #中文标示
x = [1,2,3,4,5,6,7,8]
y = [5,2,4,2,1,4,5,2]
x1 = [8,7,6,5,4,3,2,1]
y1 = [4,9,5,6,7,8,7,4]
plt.legend(loc='best') #图例显示及位置
plt.plot(x,y,'r',label='cpu')  #红色标示cpu,且图例名字为cpu
plt.plot(x1,y1,'b',label='内存') #蓝色标示内存,且图例名字为内存
plt.xlabel('时间') #X轴标题
plt.ylabel('cpu占用率')#y轴标题
plt.title('某某进程cpu内存占用图') #标题
plt.grid(True)#显示网格
plt.show()

目前库方法就介绍到这里
剩下的部分看起来就是结合着两部分,但是实际遇到了很多困难
1.表中的时间戳怎么设置?
2.获取的内存cup信息的间隔时间怎么确定?
3.对于这些信息是写入文件,还是放入缓存
4.进程退出报错如何处理?
因为时间有限,我下面的代码,只解决的几个问题,也希望你能多多指点

import matplotlib.pyplot as plt
import psutil
import time
import datetime
#获得想要进程的信息(用进程名找到进程号)
def get_process_info(process_name):
    '''
    获取进程信息
    :param process_name: 输入进程名
    '''
    for i in psutil.pids():
        pid = None
        p =  psutil.Process(i)
        if p.name() == process_name:
            pid = i
            break
    with open("E:\python\Py_29\data.txt",mode="a") as f:
        for i in range(10):
                cpu_list = psutil.Process(pid).cpu_times()
                mem_list = psutil.Process(pid).memory_info()
                time_ack = datetime.datetime.now().strftime("%M:%S")
                mem_prent = mem_list[0] / mem_list[1]
                f.write(str(time_ack) + "-" + str(mem_prent) + "-" + str(cpu_list[0]) + "-" +"\n")
                time.sleep(1)

get_process_info("TXEDU.exe")
with open("case.log") as f:
    cenent = f.readlines()
cpu_list = []
mem_list = []
time_list = []
for i in cenent:
    list_a = i.split("-")
    time_list.append(list_a[0])
    cpu_list.append(list_a[2])
    mem_list.append(list_a[1])

plt.rcParams['font.sans-serif']=['SimHei']  #中文标示
plt.legend(loc='best') #图例显示及位置
plt.xticks(rotation=60)
plt.plot(cpu_list,time_list,'r',label='cpu')  #红色标示cpu,且图例名字为cpu
# plt.plot(y,x1,'b',label='men')  #红色标示cpu,且图例名字为cpu
plt.xlabel('时间') #X轴标题
plt.ylabel('cpu占用率')#y轴标题
plt.title('某某进程cpu内存占用图') #标题
plt.grid(True)#显示网格
plt.gcf().autofmt_xdate()
plt.show()
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值