Python教程:使用psutil和rich库实现一个终端资源监控小工具(附完整代码)

在本文中,我们将介绍如何使用 Python 的 psutil 和 rich 库来实现一个终端资源监控小工具。psutil 是一个跨平台的 Python 库,用于获取关于系统进程和系统利用率的信息,而 rich 是一个 Python 库,用于在终端中创建美观的输出。

1.psutil 库介绍

psutil(Python System and Process Utilities)是一个强大的跨平台库,用于获取关于系统进程和系统利用率的信息,例如 CPU、内存、磁盘、网络等。它提供了简单易用的接口,可以方便地监控和管理系统资源。

在本项目中,我们主要使用 psutil 来获取关于指定进程的详细信息,例如进程的用户名、创建时间、线程数、CPU 占比、内存占比等。

2.rich 库介绍

rich 是一个 Python 库,用于在终端中创建美观的输出。它提供了丰富的样式和布局选项,使得在终端中输出信息更加清晰和易读。

在本项目中,我们将使用 rich 库来创建一个美观的表格,显示获取到的进程信息。

3.设计思路

  1. 导入所需的库:我们首先需要导入 psutil 和 rich 库,以及一些其他必要的模块。

  2. 编写函数获取目标进程:编写一个函数,通过进程名称获取指定进程的详细信息。

  3. 编写函数显示信息:编写一个函数,使用 rich 库创建一个表格,并显示获取到的进程信息。

  4. 主程序逻辑:在主程序中,设置要监控的进程名称和更新时间间隔,并调用上述函数实现监控功能。

4.实现原理

  1. 使用 psutil 库的 psutil.Process() 方法获取指定进程的详细信息,例如用户名、创建时间、线程数、CPU 占比、内存占比等。

  2. 使用 rich 库的 Table 类创建一个表格,使用 add_column() 方法添加列,使用 add_row() 方法添加行,并使用 console.log() 方法在终端中输出表格。

  3. 在主程序中,设置一个循环,每隔一定时间获取一次指定进程的信息,并使用 rich 库在终端中显示。

5.工具整体功能介绍

  1. 进程信息获取功能:

    • 使用 psutil.pids() 获取当前系统所有进程的 PID 列表。
    • 遍历每个 PID,通过 psutil.Process(pid) 获取进程对象 p
    • 判断进程对象 p 的名称是否包含指定的进程名 procName,以确定目标进程。
  2. 进程信息展示功能:

    • 使用 rich 库中的 Table 类创建一个表格,用于展示进程的详细信息。
    • 将进程的关键信息(如用户名、创建时间、线程数、CPU 占比、内存占比等)添加到表格中的不同行中。
    • 使用 console.log() 方法将表格和其他相关信息以美观的格式输出到终端。
  3. 循环监控功能:

    • 在 showMsg 函数中使用 while True 循环,持续监控目标进程的状态。
    • 每次循环中,重新获取目标进程的信息并更新展示在终端上的表格。
    • 使用 time.sleep(timeInterval) 控制每次更新的时间间隔,避免过度频繁地查询和展示信息。
  4. 异常处理:

    • 使用 try 和 except 块捕获 psutil.Process(pid) 可能抛出的异常,确保程序在获取进程信息时不会意外中断。
  5. 主程序逻辑:

    • 在主程序中,通过读取配置文件(例如 Config.py)获取要监控的进程名称和更新时间间隔。
    • 初始化 rich 库中的 Console 对象,用于在终端上输出信息。
    • 调用 showMsg 函数,传入要监控的进程名称和时间间隔,实现进程信息的持续监控和展示。

6.完整代码及配置如下

monitor.py

# -*- coding: gbk -*-
'''
Created on 2022年11月24日@author: DanMo
@status: done
'''
import time
import psutil
from rich.console import Console
from rich.table import Column, Table
from rich.progress import track
from Config import configdef getTargetProc(procName):pidList = psutil.pids()for pid in track(pidList, description="获取本机所有进程..."):try:p = psutil.Process(pid)except:continueif procName in p.name():return pdef showMsg(procName, timeInterval):while True:table = Table(show_header=True, header_style="bold magenta")table.add_column("项目", style='dim')table.add_column("详情", style='dim')p = getTargetProc(procName)table.add_row('用户', f'{p.username()}')table.add_row('进程创建时间', f'{p.create_time()}')table.add_row('线程数', f'{p.num_threads()}')table.add_row('父进程', f'{p.parent()}')table.add_row('当前进程状态', f'{p.status()}')table.add_row('被调用的命令行', f'{p.cmdline()}')table.add_row('exe', f'{p.exe()}')table.add_row('io', f'{p.io_counters()}')table.add_row('CPU占比', f'{p.cpu_percent()}')table.add_row('内存占比', f'{p.memory_percent()}')table.add_row('当前进程打开的句柄数', f'{p.num_handles()}')console.log('进程信息总览:\n', p.__dict__, style='dim')console.log('当前进程创建的所有线程:\n', p.threads(), style='dim')console.log('打开的文件:\n', p.open_files(), style='dim')console.log('子进程:\n', p.children(True), style='dim')console.log('进程所有连接信息[IPv4、IPv6、TCP、TCP over IPv4、TCP over IPv6、UDP、UDP over IPv4、UDP over IPv6、UNIX socket (both UDP and TCP protocols)]:\n',p.connections('all'), style='dim')if config.get_conf('envPath'):console.log('环境变量:\n', p.environ(), style='dim')console.log('内存信息:\n', p.memory_full_info(), style='dim')if config.get_conf('memorymap'):console.log('内存映射:\n', p.memory_maps(), style='dim')console.log('其他关于进程的信息:\n', style='dim')console.log(table)time.sleep(timeInterval)if __name__ == '__main__':console = Console()procName = config.get_conf('processname')timeInterval = config.get_conf('timeinterval')showMsg(procName, timeInterval)

Config.py

# -*- coding: gbk -*-
'''
Created on 2022年11月24日@author: DanMo
@status: done
'''
import os
import json
import threading
import configparserworkpath = os.path.dirname(os.path.abspath(__file__))
configFile = os.path.join(workpath, 'config.txt')
_lock = threading.Lock()class CConfig(object):'''实现对配置的操作本类中,配置文件为config.txt对外部提供的结构为:set_confget_confclean_confcleanall_conf'''def __init__(self, filename='config.txt'):self.filename = os.path.abspath(filename)self.config = configparser.ConfigParser(allow_no_value=True)# TODO:xiehs config逻辑,可以采取预先读取所有的方式,进行性能提高def set_conf(self, option, value=None, section='Monitor'):try:_lock.acquire()if not os.path.exists(self.filename):tmpf = open(self.filename, 'w')tmpf.close()if not self._is_exist(self.filename):raise Exception('CONFIG_File_Not_File')self.config.read(self.filename)if not self.config.has_section(section):self.config.add_section(section)self.config.set(section, option, json.dumps(value))with open(self.filename, 'w') as configfile:self.config.write(configfile)finally:_lock.release()def get_conf(self, option, section='Monitor'):if not os.path.exists(self.filename):return Noneif not self._is_exist(self.filename):raise Exception('CONFIG_File_Not_File')self.config.read(self.filename)if not self.config.has_section(section) or not self.config.has_option(section, option):return Noneval = self.config.get(section, option)val = json.loads(val)return valdef _is_exist(self, path):return os.path.isfile(path)config = CConfig(configFile)

config.txt

[Monitor]
processname = "YourAppName"
timeinterval = 4
memorymap = false
envPath = false

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/5246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode:1103. 分糖果 II + 模拟】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

山东专升本计算机基础 --- Windows 10 操作系统安全

文章目录 Windows 10 操作系统安全1、Windows 10 系统安装的安全2、系统帐户安全3、应用安全策略4、网络安全策略 Windows 10 操作系统安全 1、Windows 10 系统安装的安全 操作系统的安全和安装操作系统的选项密切相关。 选择 NTFS 文件格式分区组件的定制安装 Windows 10 …

LiveCD镜像文件的定制化

最近想要定制化一款属于自己的LiveCD镜像文件,并且里边封装好所需要的软件程序,本文将会记录具体的操作步骤,供有需要的人参考借鉴。 环境说明: 环境配置说明配置参数编码环境Centos7.9LiveCD文件CentOS-7-livecd-x86_64.iso 附…

西门子PCU50.3数控面板维修6FC5220-0AA31-2AA0

西门子数控面板维修,西门子工控机触摸屏维修6FC5247-0AA00-0AA3 西门子数控机床维修包括:840C/CE、840Di/DSL、840Di SL、802C S、802D SL、810D/DE、820D SL、S120数控电路板、数控伺服驱动模块、控制模块修、电源模块,西门子数控机床控制面…

Redis缓存介绍以及常见缓存问题:穿透、雪崩和击穿

概念 缓存就是数据交换的缓冲区(Cache),是存贮数据的临时地方,一般读写性能较高。 作用: 降低后端负载 提高读写效率,降低相应时间 成本: 数据一致性成本 代码维护成本 运维成本 缓存更…

ICSE 2024 PaperList1

1. 勒索软件攻击造成的数据破坏的实证研究 An Empirical Study of Data Disruption by Ransomware Attacks 近年来,勒索软件对软件生态系统的威胁日益令人担忧,这就提出了对大规模、全面的勒索软件分析的需求,以帮助针对未知攻击制定更有效…

如何使用dlib库进行目标跟踪

dlib 库本身并不直接提供目标跟踪的功能。目标跟踪是计算机视觉领域的一个独立任务,通常涉及对视频序列中的特定目标(如人脸、车辆、行人等)进行持续的识别和定位。然而,dlib 库中的某些组件(如人脸检测器、HOG特征提取器等)可以被用作构建目标跟踪系统的基础。 要在dli…

QT爱发函,介绍一下平替QT的八大桌面开发框架。

Qt是一款跨平台的C应用程序开发框架,它提供了丰富的库和工具,可以用于开发图形用户界面、嵌入式系统、移动应用等。Qt拥有商业版和开源版两种许可证,商业版需要支付授权费用,而开源版则可以免费使用。 对于替代Qt的框架&#xff0…

前端如何将接口传来的列表数据(数组)直接下载成csv文件

前言:最近遇到一个需求,需要实现一个下载表格数据的操作,一般来说是前端请求后端的下载接口,将文件流下载下来,但是因为这个项目任务时间比较紧,后端没时间做下载接口,所以暂时由前端直接调列表…

新手开通抖音小店的时候,必须要注意的6点!建议收藏!

大家好,我是电商小V 今天咱们就来详细的说一下开通抖音小店的时候需要注意的事项,避免咱们在开店的时候踩坑导致店铺后期的正常运营, 第一点:是关于营业执照的问题 营业执照咱们都知道,分为个体和企业的,咱…

区块链详解

1. 概述 1.1 什么是区块链? 区块链是一种分布式数据库技术,它以链式数据结构的形式存储数据,每个数据块与前一个数据块相关联,形成了一个不断增长的数据链。每个数据块中包含了一定数量的交易信息或其他数据,这些数据…

Servlet、Tomcat、Control区别

1. Servlet Servlet 是一种动态网站开发技术,专门用来处理客户端的请求并生成响应。Servlet直接与Tomcat交互,处理从Tomcat传来的请求。然后生成网页或其他类型的响应发送回Tomcat,Tomcat再将这些响应返回给用户的浏览器。 2. TomCat tomc…

【数据结构】三、栈和队列:2.顺序栈共享栈(顺序栈的初始化,判空,进栈,出栈,读取栈顶,顺序栈实例)

文章目录 1.顺序栈1.1初始化1.2判空1.3进栈1.4出栈1.5读取栈顶1.6销毁栈❗1.7顺序栈c实例 2.共享栈2.1初始化2.2判满 1.顺序栈 用顺序存储实现的栈 顺序栈的缺点:栈的大小不可变。 #define MaxSize 10 //定义栈中元素的最大个数 typedef struct{ElemType data[…

28377d升级

dsp 28377在线升级 实例总结_f021_cpu0_w1_register_address-CSDN博客

leetcode1143. 最长公共子序列(ACM模式解法)

题目描述 给你一个序列X和另一个序列Z&#xff0c;当Z中的所有元素都在X中存在&#xff0c;并且在X中的下标顺序是严格递增的&#xff0c;那么就把Z叫做X的子序列。 例如&#xff1a;Z是序列X的一个子序列&#xff0c;Z中的元素在X中的下标序列为<1,2,4,6>。 现给你两个…

指纹浏览器:网络安全与隐私的新工具

在互联网时代&#xff0c;隐私和网络安全成为人们越来越关注的话题。随着数字化的发展&#xff0c;个人信息的泄露和在线追踪的问题愈发严峻。在这个背景下&#xff0c;"指纹浏览器"作为一种新型工具&#xff0c;开始受到关注。撸空投需要了解指纹浏览器。本文将深入…

动态规划与搜索算法

动态规划&#xff08;Dynamic Programming, DP&#xff09; 动态规划是一种解决优化问题的算法设计技术&#xff0c;主要用于求解具有重叠子问题和最优子结构特性的最优化问题。在动态规划中&#xff0c;我们会将复杂问题分解为多个子问题&#xff0c;并计算子问题的解&#x…

软考-信息系统项目管理师-论文技术架构模板(60天备考第26天)

分享一段信息系统项目管理师论文项目技术架构描述的万能模板&#xff0c;供大家参考。距离考试还有二十八天&#xff0c;如果论文写不好的可以加微进论文指导群学习论文写作。 该系统前端基于Vue开发&#xff0c;后端基于java开发&#xff0c;前后端分离部署。整体采用B/S架构&…

你缺的是一个机会吗?

大家好&#xff0c;我是记得诚。 前两天面试了一个&#xff0c;差不多有5-6年的硬件开发经验&#xff0c;没有达到我的要求&#xff0c;给否掉了。 大公司里面&#xff0c;分工很细&#xff0c;原理图一个人&#xff0c;甚至系统大的产品&#xff0c;原理图由几个人共同完成&…

【收藏全开源】JAVA共享自习室共享学习室无人系统支持微信小程序+微信公众号+H5_博纳软云

JAVA打造无人自习室新纪元&#xff1a;微信小程序、公众号与H5三合一共享学习空间 在信息化时代的浪潮下&#xff0c;学习方式正经历着前所未有的变革。JAVA技术以其强大的跨平台性和稳定性&#xff0c;引领着共享自习室领域迈向新的高度。我们推出的无人自习室共享学习室系统…