萝卜头IT论坛

搜索
查看: 3451|回复: 31
收起左侧

【有彩蛋!】Python实现简易系统资源监视器 第二版

[复制链接]
发表于 2022-10-14 11:11:47 | 显示全部楼层 |阅读模式
本帖最后由 爱电脑的昕宇 于 2022-10-17 19:38 编辑

第二版新增:
1、磁盘与网络IO支持MB与KB间的换算(仅当程序运行30秒以上时有效)
2、为了纪念我一段长达2年却没有结果的暗恋,我加了一个彩蛋。触发方式:在程序同路径新建一文本文档,命名为lyyily.txt,然后运行程序。如果标题栏的“By 爱电脑的昕宇”出现了一些变化则说明触发成功。此时您只需要耐心等待程序运行52.0秒时,就可以一睹为快了。
下载地址
程序简介


这个程序可以实时监测CPU利用率、内存占用、磁盘IO以及网络IO。程序自动强制位于所有窗口顶层,方便观察数据。当然,也可以最小化。
你甚至可以导出图表为图片文件。只要点击下方按钮栏的保存按钮就可以了。

Figure_1.png
兼容性信息


.exe版支持32位或64位的Windows7及以上操作系统(需要VC运行库)
.py脚本借助Python运行环境可以运行在Windows2000及以上版本的操作系统,以及Linux/MacOS

已知问题与程序局限性

1、磁盘与网络部分单位无法改变。磁盘读写只能以MB为单位,网络传载只能以KB为单位。
2、主页面的图例使用了歪果仁的语言,因为pylab包不支持中文。
3、x轴单位问题。由于作品逻辑缺陷以及硬件性能的差异,单位时间可能随程序运行由初始的0.8秒变长。但是当单位时间增长到1秒时会停止变化。
4、磁盘IO的计算是通过获取单位时间起始点所有磁盘总写入(读取)量之和并作差,公式大致为
image.png
(u为单位时间写入/读取内容大小,D为每个磁盘第二次总读/写量,d为每个磁盘第一次总读/写量)
所以程序当有多个储存设备连入系统时,只显示一对曲线。当你拔出某个设备时,磁盘读写数据可能出现一组负数。
5、注意:较新版本的python运行此程序的核心部分会出现无法关闭的错误,如果您使用的是python3.8以上的版本,请下载文末标有“for 较新版本的python”的脚本,或下载exe版本。

截图


image.png
image.png


以下是我的源码的核心部分(话说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()



task .pyw

3.01 KB, 下载次数: 133

task .pyw

3.75 KB, 下载次数: 131

for 较新版本的python

回复

使用道具 举报

 楼主| 发表于 2022-10-14 15:32:14 | 显示全部楼层
本帖最后由 爱电脑的昕宇 于 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”脚本中加入了一个发射器,运行程序后并不能直接打开折线图画面,如图



image.png



所以,强烈推荐您下载exe版本。


PS.倾心设计的程序图标,漂不漂亮
image.png

回复

使用道具 举报

发表于 2022-10-14 11:31:40 | 显示全部楼层
嗯,要是能打包编成exe就更好了。
回复

使用道具 举报

发表于 2022-10-14 11:33:09 | 显示全部楼层
hjr小黄人 发表于 2022-10-14 11:31
嗯,要是能打包编成exe就更好了。

打包简单
Python有一个库 专门是打包exe的
楼主可以百度下
回复

使用道具 举报

 楼主| 发表于 2022-10-14 11:43:47 | 显示全部楼层
本帖最后由 爱电脑的昕宇 于 2022-10-14 11:45 编辑
Ace_qingfeng 发表于 2022-10-14 11:33
打包简单
Python有一个库 专门是打包exe的
楼主可以百度下

那我打包一下,但是EXE应该挺大的
我之前打包EXE用的Windows7 32位环境坏了,我还得再装一个,要是用64位系统打包程序会又大又卡。
回复

使用道具 举报

发表于 2022-10-14 11:52:28 来自手机 | 显示全部楼层
作业写完了?
又有新作!
回复

使用道具 举报

发表于 2022-10-14 13:04:02 | 显示全部楼层
OOO 发表于 2022-10-14 11:52
作业写完了?
又有新作!

hhhh 别刺激他嘛 (我也没写完
回复

使用道具 举报

 楼主| 发表于 2022-10-14 13:06:45 | 显示全部楼层
Ace_qingfeng 发表于 2022-10-14 13:04
hhhh 别刺激他嘛 (我也没写完

哈哈哈我也没写完
话说周五的作业还没留呢,趁着这个真空期……哈哈哈
回复

使用道具 举报

发表于 2022-10-14 13:43:40 | 显示全部楼层
爱电脑的昕宇 发表于 2022-10-14 11:43
那我打包一下,但是EXE应该挺大的
我之前打包EXE用的Windows7 32位环境坏了,我还得再装一个,要是用64位 ...

是PyInstaller,也可以用auto-py-to-exe(如果你不懂英文,不过看楼主很懂啊)
回复

使用道具 举报

联系我们(Contact)|手机版|萝卜头IT论坛 ( 苏ICP备15050961号-1 )

GMT+8, 2024-5-8 05:30 , Processed in 0.121101 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表