psutil库使用详解

news2024/11/26 0:50:06

一、背景

在Python的世界里,有一些库因其强大的功能和易用性而备受开发者们的喜爱。今天,我们要介绍的就是其中的一员——psutil库。psutil(python system and process utilities)是一个跨平台的第三方库,用于获取系统运行时的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要用于系统监控,性能分析,进程管理等场景。

二、安装&基本使用

psutil安装:

pip install psutil

安装完成后,我们就可以开始使用psutil库了。下面,我们将介绍一些常用的功能。

1、获取CPU信息

psutil库可以获取CPU的使用情况。例如,我们可以使用psutil.cpu_percent(interval=1)来获取CPU的使用率。

import psutil
cpu_percent = psutil.cpu_percent(interval=1)print(f'CPU usage: {cpu_percent}%')

2、获取内存信息

我们可以使用psutil.virtual_memory()来获取系统的内存使用情况。

import psutil
mem_info = psutil.virtual_memory()print(f'Total memory: {mem_info.total / (1024**3):.2f} GB')print(f'Used memory: {mem_info.used / (1024**3):.2f} GB')print(f'Memory usage: {mem_info.percent}%')

3、获取磁盘信息

psutil库也可以获取磁盘的使用情况。例如,我们可以使用psutil.disk_usage(‘/’)来获取根目录的磁盘使用情况。

import psutil
disk_usage = psutil.disk_usage('/')print(f'Total disk space: {disk_usage.total / (1024**3):.2f} GB')print(f'Used disk space: {disk_usage.used / (1024**3):.2f} GB')print(f'Disk usage: {disk_usage.percent}%')

4、获取进程信息

psutil库还可以获取系统中运行的所有进程的信息。例如,我们可以使用psutil.pids()来获取所有进程的PID。

import psutil
pids = psutil.pids()print(f'Total processes: {len(pids)}')

三、项目应用实战

图片

假设有这样的一个需求:长时间运行Pycharm程序,监控Pycharm程序的CPU/内存占用,以验证Pycharm程序在长时间打开的情况下,程序是否会存在CPU占用率升高或内存泄漏的情况。

基于这样的需求,我们可以使用psutil库和pandas库来完成,脚本如下:

1、获取电脑整体的CPU、内存占用情况

# 获取电脑整体的CPU、内存占用情况def getMemory():    data = psutil.virtual_memory()    memory = str(int(round(data.percent))) + "%"    print("系统整体memory占用:"+memory)    return memory

def getCpu():    cpu_list=psutil.cpu_percent(percpu=True)    average_cpu = round(sum(cpu_list) / len(cpu_list),2)    cpu=str(average_cpu) + "%"    print("系统整体cpu占用:"+cpu)    return cpu

2、获取指定进程的CPU和内存占用信息代码

# 获取指定进程的CPU和内存占用信息代码def getMemSize(pid):    # 根据进程号来获取进程的内存大小    process = psutil.Process(pid)    memInfo = process.memory_info()
    # rss: 该进程实际使用物理内存(包含共享库占用的全部内存)。    # vms:该进程使用的虚拟内存总量。
    return memInfo.rss / 1024 / 1024
def getCpuPercent(pid):    # 根据进程号来获取进程的内存大小    p = psutil.Process(pid)    p_cpu = p.cpu_percent(interval=0.1)    cpu = round(p_cpu,2)    return cpu
def getTotalM(processName):    # 一个进程名对应的可能有多个进程    # 进程号才是进程的唯一标识符,进程名不是    totalM = 0    for i in psutil.process_iter():        if i.name() == processName:            totalM += getMemSize(i.pid)    print('进程占用内存:%.2f MB' % totalM)    finalM=round(totalM,2)    return finalM
def getTotalCPU(processName):    # 一个进程名对应的可能有多个进程    # 进程号才是进程的唯一标识符,进程名不是    totalCPU = 0    for i in psutil.process_iter():        if i.name() == processName:            totalCPU += getCpuPercent(i.pid)    totalCPU_convert=round(totalCPU,2)    finalCPU=str(totalCPU_convert)+'%'    print("进程占用CPU:"+finalCPU)    return totalCPU_convert

3、将测试结果数据写入csv文件

# 将测试结果数据写入csv文件def writeExcel(caseName,cpu,mem,pycharmcpu,pycharmmem):    timestamp = time.strftime('%Y-%m-%d-%H:%M:%S', time.localtime(time.time()))    dict = {'caseName': [caseName], 'Sys_CPU': [cpu], 'Sys_Memory': [mem], 'Pycharm_Cpu': [pycharmcpu], 'Pycharm_Mem': [pycharmmem],'OperationTime':[timestamp]}
    # 字典中的key值即为csv中列名    dataframe = pd.DataFrame(dict)    dataframe['OperationTime'] = pd.to_datetime(dataframe['OperationTime'])
    # 将DataFrame存储为csv, mode='a'表示每一次都是追加内容而不是覆盖,header=False表示不写列名    dataframe.to_csv("cpuAndMemtest.csv", date_format='%Y-%m-%d-%H:%M:%S', mode='a',index=False,header=False,encoding='GBK')

4、封装方法为函数,以便后续直接调用

# 封装方法为函数,以便后续直接调用def getCpuAndMem(caseName,processName1):    memory = getMemory()    cpu = getCpu()    # 获取pycharm64.exe进程占用的CPU和内存    pycharmmem = getTotalM(processName1)    pycharmcpu = str(getTotalCPU(processName1))+'%'
    time.sleep(1)    writeExcel(caseName,cpu,memory,pycharmcpu,pycharmmem)    print("系统整体CPU占用:%s     系统整体内存占用:%s   进程_CPU占用:%s  进程内存占用:%s"%(cpu, memory, pycharmcpu, pycharmmem))    print("===============================================================")

5、运行脚本

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

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

相关文章

MySQL 事务与存储引擎

目录 一、MySQL事务的概念 二、事务的ACID特点 2.1 原子性 2.2 一致性 2.3 隔离性 2.4 持久性 2.5 事务之间的相互影响 三、Mysql及事物隔离级别 3.1 查询全局事务隔离级别 3.2 查询会话事务隔离级别 3.3 设置全局事务隔离级别 3.4 设置会话事务隔离级别 …

Android自定义圆环进度条/刻度仪表盘(单环单点带动画)

效果图: 1.自定义HeartDashBoardView /*** 刻度仪表盘*/ public class HeartDashBoardView extends View {private static final float START_ANGLE 135f;private static final float MAX_ANGLE 270f;private float progress 0;private float centerX;private float center…

快快快快快快快快快快排

作者简介:დ旧言~,目前大一,现在学习Java,c,Python等 座右铭:松树千年终是朽,槿花一日自为荣。 望小伙伴们点赞👍收藏✨加关注哟💕💕 C语言实现快排☺️ ℹ️…

应届毕业生要如何准备秋招简历?

秋招对于应届毕业生是一个求职的重要渠道,但是很多应届毕业生却不知道要如何制作秋招简历。那么,秋招简历应该如何制作呢?接下来,小编给大家讲一讲简历制作(https://www.jiaobu365.com/)的哪些事&#xff0…

2023 世界人工智能大会(WAIC)人才培养论坛成功举办!

Datawhale论坛 来源:2023 世界人工智能大会(WAIC) 前 言 2023 年 7 月 8 日,“2023世界人工智能大会”(WAIC)落下帷幕。7 月 8 日上午,WAIC 的主要分论坛之一“AIGC时代下的青年开发者人才培养…

什么样的性能测试工具才算是好的工具呢?

一、性能测试工具的特征 调度能力 因为性能测试不可能由一台压力机完成或者说大部分情况下,我们不能不可能由一台压力机来完成,凡是对压力真正有所要求的场景,往往是多台压力机共同施加压力完成性能测试;因此,性能测…

【GitHub】强大的终端录制工具-Terminalizer

Terminalizer 是一个GitHub上优秀的开源项目,目前项目点赞数已达:14k,该项目可以轻松记录下你在命令行的操作,并将录制好的内容输出成 gif 图像或直接分享到网上。 项目开源协议:MIT 项目主开发语言:JavaSc…

Vue计算属性:简化数据处理和视图更新的利器

一、计算属性的基本使用 计算属性:一个特殊属性,值依赖于另外一些数据动态计算出来。🚩🚩🚩计算属性特点:函数内使用的变量改变,重新计算结果返回。💣💣💣注…

uniapp实现聊天消息触,vue3和vue2实现聊天消息触底 scrollTop ,scrollHeight Pc端H5端都适用

uniapp触底SDN链接如下(本人的另一篇博客) uniapp聊天时时触底链接 Pc端 模拟手机端H5 vue3写法 <template><div><!-- 聊天窗体 --><div class"test" id"gundong"><div class"text" v-for"p in chat"&…

Html基础知识学习——兼容问题与解决方法

文章目录 1.计算一定要精确&#xff0c;不要让内容的宽高超出我们设置的宽高&#xff0c;在IE6下内容会撑开设置好的宽高2.元素浮动&#xff0c;宽度需要内容撑开&#xff0c;就给里面的块元素都加浮动3.在ie6.ie7下元素要浮动并在同一行 就给这些元素都加浮动4.注意标签嵌套规…

C# WPF实现动画渐入暗黑明亮主题切换效果

C# WPF实现动画渐入暗黑明亮主题切换效果 效果图如下最近在Bilibili的桌面端看到一个黑白主题切换的效果感觉,挺有意思。于是我使用WPF尝试实现该效果。 主要的切换效果,基本实现不过还存在一些小瑕疵,比如字体等笔刷不能跟随动画进入进行切换。因为Bilibili的客户端是用el…

【算法 -- LeetCode】(018) 四数之和

1、题目 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1a; …

【Hadoop 01】简介

1 Hadoop 简介 Hadoop适合海量数据分布式存储和分布式计算 Hadoop 3.x的细节优化&#xff1a; Java改为支持8及以上HDFS支持纠删码HDFS支持多NameNodeMR任务级本地优化多重服务默认端口变更 Hadoop主要包含三大组件&#xff1a;HDFSMapReduceYARN HDFS负责海量数据的分布式存…

HttpRunner自动化之跨文件传递变量值输出变量值

跨文件传递&输出变量值 output: 输出变量值,此参数在httprunner2.2版本的时候被 export 代替&#xff0c;跨文件传递参数的功能在httprunner2.2之后不生效。&#xff08;但是实际测试过程中&#xff0c;还可以使用跨文件功能&#xff09; export: 输出变量值,且可以跨文件…

(黑客)网络安全靠自学?你不要命啦?

引言⚡ ✈️网络安全&#xff0c;顾名思义&#xff0c;无安全&#xff0c;不网络。现如今&#xff0c;安全行业飞速发展&#xff0c;我们呼吁专业化的 就职人员 与 大学生 &#xff0c;而你&#xff0c;认为自己有资格当黑客吗&#xff1f; ✒️本文面向所有信息安全领域的初学…

2023-07-14:讲一讲Kafka与RocketMQ中存储设计的异同?

2023-07-14&#xff1a;讲一讲Kafka与RocketMQ中存储设计的异同&#xff1f; 答案2023-07-14&#xff1a; 在Kafka中&#xff0c;文件的布局采用了Topic/Partition的方式&#xff0c;每个分区对应一个物理文件夹&#xff0c;且在分区文件级别上实现了顺序写入。然而&#xff0…

springboot逍遥大药房管理系统

逍遥大药房管理系统的需求和管理上的不断提升&#xff0c;逍遥大药房管理的潜力将无限扩大&#xff0c;逍遥大药房管理系统在现代社会上被广泛关注&#xff0c;本系统对此进行总体分析&#xff0c;将逍遥大药房信息管理的发展提供参考。逍遥大药房管理系统对逍遥大药房管理方面…

xxl-job的简单使用

xxl-job是一个分布式任务调度框架&#xff0c;在Spring中&#xff0c;提供有任务调度的注解功能&#xff0c;在之前的项目中&#xff0c;非分布式任务都可以直接使用Spring框架提供的Scheduled注解和EnableScheduling注解来实现定时任务。 EnableScheduling注解加载项目启动类上…