python:psutil获取指定进程Cpu及Memory使用的GUI界面

1导入依赖库

import os
import psutil
import time
from pyecharts import options as opts
from pyecharts.charts import Line
import PySimpleGUI as sg
from datetime import datetime
from concurrent.futures import ThreadPoolExecutor
import ctypes
import sys

2主界面及功能设计

class ScatterPlotGUI:def __init__(self):self.loc_path = os.getcwd()self.errorLog_path = os.path.join(self.loc_path, "errorLog")self.fig_save_path_folder = os.path.join(self.loc_path, "ReportFile")self.fig_save_path = ""self.process_names = ""  self.running = Falseself.delay = 0self.executor = ThreadPoolExecutor(max_workers=1)sg.theme('BrownBlue')  self.win_main = sg.Window('getCpuAndMemory', self.main_layout(), font=("Times New Roman", 15),size=(400, 100))def main_layout(self):  # 程序主界面layout_file = []file_frame = [[sg.Text('ProcessName(exe):', font=("Times New Roman", 9)),sg.Input(key='-process_names-', size=(4, 1), default_text="msedge.exe",justification='center',font=("Times New Roman", 9), expand_x=True, enable_events=True),#sg.Text('CountIntervals(s):', font=("Times New Roman", 9)),sg.Input(key='-delay-', size=(4, 1), default_text="3", justification='center', font=("Times New Roman", 9), expand_x=True, enable_events=True),  #],[sg.Button('On', key='-start-', size=(10, 1), font=("Times New Roman", 9), expand_x=True, disabled=False),sg.Button('Off', key='-stop-', size=(10, 1), font=("Times New Roman", 9), expand_x=True, disabled=True),sg.Button('EXIT', key='-EXIT-', font=("Times New Roman", 9), expand_x=True),],]layout_file.append([sg.Frame(layout=file_frame, title="getCpuAndMemory", expand_x=True, font=("Times New Roman", 8))])return layout_filedef run(self):if not os.path.exists(self.fig_save_path_folder):  # fig_save_path_folderos.mkdir(self.fig_save_path_folder)time_path = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')while True:##task_pool = ThreadPoolExecutor(max_workers=1)event_main, value_main = self.win_main.Read()self.fig_save_path = os.path.join(self.fig_save_path_folder, time_path)self.process_names = value_main['-process_names-']self.delay = int(value_main['-delay-'])if event_main in (sg.WINDOW_CLOSED, "-EXIT-"):breakelif event_main == '-process_names-':self.win_main['-start-'].update(disabled=False)elif event_main == '-start-':if not os.path.exists(self.fig_save_path):os.mkdir(self.fig_save_path)self.start_accumulator()elif event_main == '-stop-':self.stop_accumulator()def getCpuAndMemory(self, process_names):# 存储内存和CPU占用数据的变量total_memory = 0total_cpu = 0# 获取指定进程的信息pids = psutil.pids()for pid in pids:try:p = psutil.Process(pid)if p.name() in process_names:# 获取进程的内存和CPU占用情况# process.memory_info()# rss: 该进程实际使用物理内存(包含共享库占用的全部内存,不包括共享内存和映射文件等)。# vms:该进程使用的虚拟内存总量。# uss: 进程的所有占用的私有物理内存大小,包括私有物理内存、共享内存和映射文件等。#mem = p.memory_info().rss / (1024 ** 2)  # 单位:MBmem = p.memory_full_info().uss / (1024 ** 2)  # 单位:MB  #更准确cpu = p.cpu_percent(interval=0.5)# 累加内存和CPU占用量total_memory += memtotal_cpu += cpu#print("==>>> processName:%s   processStatus:%s   processMememory:%.4f   processCPU:%.4f <<<==" % (p.name(), p.status(), mem, cpu))except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess) as e:pass# except psutil.NoSuchProcess as e1:#     #print("no process found with pid=&s" % pid)#     print("@NoSuchProcess>>> ", e1)#     pass# except psutil.AccessDenied as e2:#     #print("no process found with pid=&s" % pid)#     print("@AccessDenied>>> ", e2)#     pass# except psutil.ZombieProcess as e3:#     #print("no process found with pid=&s" % pid)#     print("@ZombieProcess>>> ", e3)#     passprint("==>>> %s   processName:%s   TotalMememory:%.4f   TotalCPU:%.4f <<<==" % (time.strftime('%Y-%m-%d %H:%M:%S'), process_names, total_memory, total_cpu))# 判断目录下是否已存在 memory.txt 和 cpu.txt 文件memory_txt = os.path.join(self.fig_save_path,'%s_memory.txt'%self.process_names[:-4])cpu_txt = os.path.join(self.fig_save_path, '%s_cpu.txt'%self.process_names[:-4])if not os.path.isfile(memory_txt):with open(memory_txt, 'w') as f:passif not os.path.isfile(cpu_txt):with open(cpu_txt, 'w') as f:passfinalMemory = '%.3f' % total_memoryfinalCPU = '%.3f' % total_cpu# 将总的内存和CPU占用量写入文件, a表示追加数据with open(memory_txt, 'a') as f:f.write(f"{time.strftime('%Y-%m-%d %H:%M:%S')} {finalMemory}\n")with open(cpu_txt, 'a') as f:f.write(f"{time.strftime('%Y-%m-%d %H:%M:%S')} {finalCPU}\n")def generateCpuAndMemoryReport(self, process_names):try:while self.running:#获取内存和CPU数据self.getCpuAndMemory(process_names)# 获取当前脚本所在的目录memory_txt = os.path.join(self.fig_save_path, '%s_memory.txt'%self.process_names[:-4])cpu_txt = os.path.join(self.fig_save_path, '%s_cpu.txt'%self.process_names[:-4])memory_html = os.path.join(self.fig_save_path, '%s_memory_monitor_report.html'%self.process_names[:-4])cpu_html = os.path.join(self.fig_save_path, '%s_cpu_monitor_report.html'%self.process_names[:-4])# 获取内存折线图需要绘制的数据信息x = []y = []with open(memory_txt) as f:for line in f:space_index = line.find(' ')if space_index != -1:data = line[space_index + 1:]  # 切片操作,保留空格之后的部分time0, per = data.strip().split()x.append(time0)y.append(float(per))  # 将字符串转换为浮点数line = (Line().add_xaxis(x).add_yaxis("", y, label_opts=opts.LabelOpts(is_show=False)).set_global_opts(title_opts=opts.TitleOpts(title="内存使用监控,单位:M")))line.render(path=memory_html)# 获取cpu折线图需要绘制的数据信息x = []y = []with open(cpu_txt) as f:for line in f:space_index = line.find(' ')if space_index != -1:data = line[space_index + 1:]  # 切片操作,保留空格之后的部分time1, per = data.strip().split()x.append(time1)y.append(float(per))  # 将字符串转换为浮点数line = (Line().add_xaxis(x).add_yaxis("", y, label_opts=opts.LabelOpts(is_show=False)).set_global_opts(title_opts=opts.TitleOpts(title="cpu使用监控,单位:百分比")))line.render(path=cpu_html)time.sleep(self.delay)except Exception as e:print("@error>>> ", e)def close(self):self.win_main.close()self.executor.shutdown(wait=True)def start_accumulator(self):if not self.running:self.running = Trueself.win_main['-start-'].update(disabled=True)self.win_main['-stop-'].update(disabled=False)self.executor.submit(self.generateCpuAndMemoryReport, self.process_names)def stop_accumulator(self):if self.running:self.running = Falseself.win_main['-start-'].update(disabled=False)self.win_main['-stop-'].update(disabled=True)print("------------------>-->>-->>> Execution stopped <<<--<<--<------------------")

3获取管理员权限执行

def is_admin():try:return ctypes.windll.shell32.IsUserAnAdmin()except:return False

4主程序

if __name__ == '__main__':if not is_admin():ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)sys.exit()mygui = ScatterPlotGUI()mygui.run()mygui.close()

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

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

相关文章

八、(正点原子)Linux内核定时器实验

定时器是我们最常用到的功能&#xff0c;一般用来完成定时功能&#xff0c;本章我们就来学习一下 Linux 内核提供的定时器 API 函数&#xff0c;通过这些定时器 API 函数我们可以完成很多要求定时的应用。 Linux内核也提供了短延时函数&#xff0c;比如微秒、纳秒、毫秒延时函数…

YOLO系列--Anchor Based Anchor Free

一、Anchor based 1.1 Anchor的定义 Anchor也被称为锚框&#xff0c;预先设置目标的大概位置&#xff0c;然后再在这些预设框的基础上进行精细化的调整。调整过程被包括分类 判断预设框是属于正样本 or 负样本-和回归调整预测框的位置。 1.2 Anchor的产生 Anchor box是指在…

长尾分布(Long-tailed Distribution)

长尾分布&#xff08; L o n g − t a i l e d D i s t r i b u t i o n Long-tailed\ Distribution Long−tailed Distribution&#xff09;是统计学和概率论中的一个重要概念&#xff0c;用于描述一组数据中尾部&#xff08;即远离均值的部分&#xff09;包含了相对较多极端值…

【Linux基础】SSH登录

SSH简介 安全外壳协议&#xff08;Secure Shell Protocol&#xff0c;简称SSH&#xff09;是一种加密的网络传输协议&#xff0c;可在不安全的网络中为网络服务提供安全的传输环境。 SSH通过在网络中建立安全隧道来实现SSH客户端与服务器之间的连接。 SSH最常见的用途是远程登…

LeetCode 算法:二叉树的最大深度 c++

原题链接&#x1f517;&#xff1a;二叉树的最大深度 难度&#xff1a;简单⭐️ 题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,…

【高考选专业 | 家长篇】2024,计算机何去何从?小P老师带你看

目录 2024年&#xff0c;计算机相关专业还值得选择吗&#xff1f;1.行业竞争现状2.专业前景分析 2024年&#xff0c;计算机相关专业还值得选择吗&#xff1f; 随着2024年高考落幕&#xff0c;数百万高三学生又将面临人生中的重要抉择&#xff1a;选择大学专业。有人欢喜&#x…

如何在Java中实现高效的缓存机制

如何在Java中实现高效的缓存机制 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 引言 在大多数软件系统中&#xff0c;缓存机制是提高性能和响应速度的关键技…

操作系统真象还原:用户进程

第11章-用户进程 这是一个网站有所有小节的代码实现&#xff0c;同时也包含了Bochs等文件 11.1 为什么要有任务状态TSS Linux 任务切换未采用 Intel 的做法&#xff0c;而是用了一套自己的方法&#xff0c;只是用了 TSS 的一小部分功能。 操作系统最直接控制的就是 CPU&…

ubuntu22.04笔记: 更换为阿里源

没有按照LTS 版本 会遇到下面问题&#xff1a; 参考&#xff1a;https://zhuanlan.zhihu.com/p/691625646 Ubuntu 22.04代号为&#xff1a;jammy Ubuntu 20.04代号为&#xff1a;focal Ubuntu 19.04代号为&#xff1a;disco Ubuntu 18.04代号为&#xff1a;bionic Ubuntu …

对于C++ 程序员来说,35岁魔咒是否存在?

大家常说程序员职业生涯会在35岁左右遇到所谓的“35岁魔咒”。这意味着在这个年龄段&#xff0c;程序员可能会面临就业不稳定或职业发展的挑战。对于C程序员来说&#xff0c;这个问题更加引人关注。 随着时间的推移&#xff0c;技术行业不断演进&#xff0c;新的编程语言层出不…

vue上传文件拿到File,下载文件到本地

vue中使用upload组件上传pdf文件&#xff0c;拿到File内容后&#xff0c;下载pdf文件到本地vue中根据url下载pdf文件到本地 File文件内容的格式 注意&#xff1a;如果使用iview的upload组件上&#xff0c;要获取File文件&#xff0c;需要在before-upload钩子上获取 async down…

Ubuntu iso 镜像下载 步骤截图说明

Ubuntu镜像下载&#xff0c;在这个网址&#xff1a; Enterprise Open Source and Linux | Ubuntu 步骤如下图所示&#xff1a; 1、登入网址 2、点击Get Ubuntu 3、点击Download Ubuntu Desktop 后续点击Downloadload 24.04 LTS直接下载就行 如果需要下载其它版本&#xf…

风速预测 | 基于MATLAB的无迹卡尔曼滤波算法UKF、SVR-UKF、ANN-Kalman等时间序列风速预测模型

基本描述 基于MATLAB的无迹卡尔曼滤波算法UKF、SVR-UKF、ANN-Kalman等时间序列风速预测模型 模型步骤 时间序列风速预测模型基于MATLAB的无迹卡尔曼滤波算法&#xff08;Unscented Kalman Filter, UKF&#xff09;、SVR-UKF&#xff08;Support Vector Regression - Unscent…

STM32学习之一:什么是STM32

目录 1.什么是STM32 2.STM32命名规则 3.STM32外设资源 4. STM32的系统架构 5. 从0到1搭建一个STM32工程 学习stm32已经很久了&#xff0c;因为种种原因&#xff0c;也有很久一段时间没接触过stm32了。等我捡起来的时候&#xff0c;发现很多都已经忘记了&#xff0c;重新捡…

【Java反射】getDeclaredField(String name) 和 getField(String name)区别

getDeclaredField(String name) 和 getField(String name) 都是Java反射API中用于获取类字段&#xff08;成员变量&#xff09;的方法&#xff0c;但它们之间存在一些关键的区别&#xff1a; getDeclaredField(String name) 功能&#xff1a;这个方法返回的是声明在该类中的指…

【驱动篇】龙芯LS2K0300之按键驱动

实验过程 实验目的&#xff1a; 在龙芯开发板上面验证GPIO按键的输入过程 ① 根据原理图连接按键板 ② 将4个i2c引脚的功能复用为GPIO ③ 注册input设备驱动&#xff0c;绑定中断处理函数&#xff0c;使用定时器消抖 原理图 4个按键引脚&#xff1a;CPU_I2C0_SCL -> G…

数据清洗过程

数据清洗是数据预处理的一个重要步骤&#xff0c;它涉及到识别和纠正&#xff08;或删除&#xff09;数据集中的错误、重复、不一致或缺失的信息。 数据清洗方法 根据清洗操作的层次分为基于模式层&#xff08;Schema-Level&#xff09;的方法和基于实例层&#xff08;Instan…

transformer中的build_attention_mask

build_attention_mask 方法的作用是构建一个因果注意力掩码&#xff0c;用于屏蔽 Transformer 模型中的未来位置。 因果注意力掩码的工作原理 因果注意力掩码通过将未来位置的注意力权重设置为负无穷大&#xff0c;从而确保这些位置的注意力得分在 softmax 计算中接近于零。具…

sqlalchemy event监听

在 SQLAlchemy 中&#xff0c;event 系统允许你监听数据库引擎、会话、映射类等对象上的事件&#xff0c;并在这些事件发生时执行自定义的代码。这对于在 SQL 语句执行前后、对象加载、对象刷新等时刻执行特定的逻辑非常有用。 要使用 SQLAlchemy 的 event 系统&#xff0c;你…

爬虫经典案例之爬取豆瓣电影Top250(方法一)

简介&#xff1a;主要使用bs4、request、pandas等模块&#xff0c;实现数据的爬取和存储。 目前存在一点小问题&#xff0c;就是个别电影的导演、演员、上映年份和地区等信息与大部分电影的这些信息的格式有细微差别&#xff0c;导致正则表达式无法正常匹配到个别电影的信息&am…