【有彩蛋!】Python实现简易系统资源监视器 第二版
本帖最后由 爱电脑的昕宇 于 2024-6-30 09:38 编辑第二版新增:
1、磁盘与网络IO支持MB与KB间的换算(仅当程序运行30秒以上时有效)
下载地址
程序简介
这个程序可以实时监测CPU利用率、内存占用、磁盘IO以及网络IO。程序自动强制位于所有窗口顶层,方便观察数据。当然,也可以最小化。
你甚至可以导出图表为图片文件。只要点击下方按钮栏的保存按钮就可以了。
兼容性信息
.exe版支持32位或64位的Windows7及以上操作系统(需要VC运行库)
.py脚本借助Python运行环境可以运行在Windows2000及以上版本的操作系统,以及Linux/MacOS
已知问题与程序局限性
1、磁盘与网络部分单位无法改变。磁盘读写只能以MB为单位,网络传载只能以KB为单位。
2、主页面的图例使用了歪果仁的语言,因为pylab包不支持中文。
3、x轴单位问题。由于作品逻辑缺陷以及硬件性能的差异,单位时间可能随程序运行由初始的0.8秒变长。但是当单位时间增长到1秒时会停止变化。
4、磁盘IO的计算是通过获取单位时间起始点所有磁盘总写入(读取)量之和并作差,公式大致为
(u为单位时间写入/读取内容大小,D为每个磁盘第二次总读/写量,d为每个磁盘第一次总读/写量)所以程序当有多个储存设备连入系统时,只显示一对曲线。当你拔出某个设备时,磁盘读写数据可能出现一组负数。5、注意:较新版本的python运行此程序的核心部分会出现无法关闭的错误,如果您使用的是python3.8以上的版本,请下载文末标有“for 较新版本的python”的脚本,或下载exe版本。
截图
以下是我的源码的核心部分(话说PyCharm真是强大,我直接把代码复制过来还给我上色了):
import matplotlib.pyplot as plt
import psutil
plt.ion()
plt.figure(1)
t_list = []
cpu_list = []
mem_list = []
disk_read = []
disk_read_bt = []
disk_written = []
disk_written_bt = []
net_sent = []
net_sent_bt = []
net_recv = []
net_recv_bt = []
t = 0# 时间初始化
while True:
plt.subplot(1, 2, 1)# 第一部分
print(t_list)
a = psutil.cpu_percent()# 获取CPU与内存占用信息
b = (psutil.virtual_memory()[2])
cpu_list.append(a)# 将数据加入列表
mem_list.append(b)
t_list.append(t)# 刷新时间
t = t + 1
plt.subplots_adjust(wspace=0.3, left=0.1, right=0.95)
plt.plot(t_list, cpu_list, c='r', ls='-', marker=',', mec='b', mfc='w', label='CPU')# 绘制图像
plt.plot(t_list, mem_list, c='b', ls='-', marker=',', mec='b', mfc='w', label='Memory')
if t == 1 or t > 31:# 加入组件
plt.legend(loc='lower left')
plt.xlabel('time')
plt.ylabel('percent')
plt.title('Performance')
plt.grid()
plt.subplot(2, 2, 2)# 第二部分
c = (psutil.disk_io_counters()[2])
e = (psutil.disk_io_counters()[3])
disk_read.append(c)
disk_written.append(e)
d = (disk_read[len(disk_read) - 1] - disk_read[len(disk_read) - 2]) / 1048576
f = (disk_written[len(disk_written) - 1] - disk_written[len(disk_written) - 2]) / 1048576
disk_read_bt.append(d)
disk_written_bt.append(f)
plt.subplots_adjust(wspace=0.3, left=0.1, right=0.95)
plt.plot(t_list, disk_read_bt, c='y', ls='-', marker=',', mec='b', mfc='w', label='Disk read')
plt.plot(t_list, disk_written_bt, c='y', ls='-.', marker=',', mec='b', mfc='w', label='Disk written')
if t == 1 or t > 31:# 加入组件
plt.legend(loc='lower left')
plt.ylabel('MB')
plt.title('Disk and Network')
plt.grid()
plt.subplot(2, 2, 4) # 第三部分
g = (psutil.net_io_counters()[0])
i = (psutil.net_io_counters()[1])
net_sent.append(g)
net_recv.append(i)
h = (net_sent[len(net_sent) - 1] - net_sent[len(net_sent) - 2]) / 1024
j = (net_recv[len(net_recv) - 1] - net_recv[len(net_recv) - 2]) / 1024
net_sent_bt.append(h)
net_recv_bt.append(j)
plt.subplots_adjust(wspace=0.3, left=0.1, right=0.95)
plt.plot(t_list, net_sent_bt, c='g', ls='-', marker=',', mec='b', mfc='w', label='Net sent')
plt.plot(t_list, net_recv_bt, c='g', ls='-.', marker=',', mec='b', mfc='w', label='Net received')
if t == 1 or t > 31:# 加入组件
plt.legend(loc='lower left')
plt.ylabel('KB')
plt.xlabel('time')
plt.grid()
plt.pause(0.5)# 移动并刷新折线
if t > 30:
del (t_list[0])
del (cpu_list[0])
del (mem_list[0])
del (disk_read[0])
del (disk_read_bt[0])
del (disk_written[0])
del (disk_written_bt[0])
del (net_sent[0])
del (net_sent_bt[0])
del (net_recv[0])
del (net_recv_bt[0])
plt.clf()
本帖最后由 爱电脑的昕宇 于 2022-10-14 15:39 编辑
几点声明:
一、程序开发环境为python3.6,中午在python3.10环境做兼容性测试时发现程序出现无法关闭的bug。使用python3.8+版本的坛友请下载文末提供的兼容版脚本,或exe版本(推荐)
下载链接:exe
二、没有及时提供exe版本,是因为没有准备32位打包环境,没有准备图标,以及上面提到的bug需要解决。
三、exe版本使用32位python3.6打包,无论您的电脑是否安装了python环境、是否已经安装了新版本的python,都可以正常运行。
四、为了兼容新版本的python,我在“for较新版本的python”脚本中加入了一个发射器,运行程序后并不能直接打开折线图画面,如图
所以,强烈推荐您下载exe版本。
PS.倾心设计的程序图标,漂不漂亮{:24:}
嗯,要是能打包编成exe就更好了。 hjr小黄人 发表于 2022-10-14 11:31
嗯,要是能打包编成exe就更好了。
打包简单
Python有一个库 专门是打包exe的
楼主可以百度下 本帖最后由 爱电脑的昕宇 于 2022-10-14 11:45 编辑
Ace_qingfeng 发表于 2022-10-14 11:33
打包简单
Python有一个库 专门是打包exe的
楼主可以百度下
那我打包一下,但是EXE应该挺大的
我之前打包EXE用的Windows7 32位环境坏了,我还得再装一个,要是用64位系统打包程序会又大又卡。
作业写完了?
又有新作! OOO 发表于 2022-10-14 11:52
作业写完了?
又有新作!
hhhh 别刺激他嘛 (我也没写完 Ace_qingfeng 发表于 2022-10-14 13:04
hhhh 别刺激他嘛 (我也没写完
哈哈哈我也没写完
话说周五的作业还没留呢,趁着这个真空期……哈哈哈 爱电脑的昕宇 发表于 2022-10-14 11:43
那我打包一下,但是EXE应该挺大的
我之前打包EXE用的Windows7 32位环境坏了,我还得再装一个,要是用64位 ...
是PyInstaller,也可以用auto-py-to-exe(如果你不懂英文,不过看楼主很懂啊)