当前位置:

首页 > 编程开发 > 如何使用Python的psutil模块获取系统的硬件、网络和进程信息

如何使用Python的psutil模块获取系统的硬件、网络和进程信息

楔子Python有一个第三方模块叫psutil,专门用来获取操作系统以及硬件相关的信息,比如:CPU、磁盘、网络、内存等等。下面来看一下它的用法,不过在使用之前需要先安装,直接pipinstallpsutil即可。CPU相关获取CPU的逻辑核心数量importpsutilprint(psutil.cpu_count())#12#或者使用multiprocessingimportmultiprocessingprint(multiprocessing.cpu_count())#12获取CPU的物理核心数量i

本文目录

    楔子

    Python 有一个第三方模块叫 psutil,专门用来获取操作系统以及硬件相关的信息,比如:CPU、磁盘、网络、内存等等。下面来看一下它的用法,不过在使用之前需要先安装,直接 pip install psutil 即可。

    CPU 相关

    获取 CPU 的逻辑核心数量

    import psutil
    print(psutil.cpu_count())  # 12
    
    # 或者使用 multiprocessing
    import multiprocessing
    print(multiprocessing.cpu_count())  # 12

    获取 CPU 的物理核心数量

    import psutil
    print(psutil.cpu_count(logical=False))  # 6

    结果为 6,说明是 6 核超线程;如果 CPU 的物理核心数和逻辑核心数相等,也为 12,则说明是 12 核非超线程。

    统计 CPU 的用户/系统/空闲时间

    import psutil
    
    print(psutil.cpu_times())
    """
    scputimes(user=84732.10937499999, 
              system=37132.85937500023, 
              idle=2003964.1249999998, 
              interrupt=3500.765625, 
              dpc=1089.6875)
    """
    
    # 还有一个 psutil.cpu_times_percent() 
    # 功能与之类似, 只不过返回的是比例

    该函数返回的是一个 namedtuple,后面凡是结构长的和这里类似的,都是 namedtuple。补充一下,如果你的程序中需要创建大量的对象,并且该对象的属性固定不变,那么不妨使用 namedtuple,相比使用字典,能节省大量空间。

    查看 CPU 的使用率

    import psutil
    
    for x in range(3):
        # interval:表示每隔 0.5s 刷新一次
        # percpu:为 True 表示查看所有的 cpu 使用率
        print(psutil.cpu_percent(interval=0.5, percpu=True))
    """
    [9.1, 3.1, 12.5, 3.1, 15.6, 0.0, 6.2, 0.0, 12.5, 50.0, 9.4, 3.1]
    [9.1, 6.2, 12.5, 6.2, 3.1, 0.0, 0.0, 3.1, 0.0, 15.6, 3.1, 0.0]
    [0.0, 0.0, 15.6, 0.0, 6.2, 0.0, 6.2, 25.0, 3.1, 9.4, 6.2, 0.0]
    """
    # 我这里 cpu 的逻辑数量是 12
    # 所以每个列表里面有 12 个元素

    查看 CPU 的统计信息

    包括上下文切换、中断、软中断,以及系统调用次数等等。

    import psutil
    
    print(psutil.cpu_stats())
    """
    scpustats(ctx_switches=3346512902, 
              interrupts=2288572793, 
              soft_interrupts=0, 
              syscalls=3324041552)
    """

    查看 CPU 的频率

    import psutil
    
    print(psutil.cpu_freq())
    """
    scpufreq(current=2208.0, min=0.0, max=2208.0)
    """

    内存相关

    查看内存使用情况

    import psutil
    
    print(psutil.virtual_memory())
    """
    svmem(total=17029259264, 
          available=7698505728, 
          percent=54.8, 
          used=9330753536, 
          free=7698505728)
    """

    total 表示总内存,available 表示可用内存,percent 表示内存使用率,used 表示已使用的内存,free 表示可用内存。

    所以 available 加上 used 等于 total,used 除以 total 再乘以 100 等于 percent。

    查看交换内存信息

    import psutil
    
    print(psutil.swap_memory())
    """
    sswap(total=3087007744, 
          used=4509839360, 
          free=-1422831616, 
          percent=146.1, 
          sin=0, 
          sout=0)
    """

    说到内存,有物理内存、交换内存、虚拟内存,这三者有什么区别呢?用大白话解释就是:

    1)物理内存是实际的内存条提供的临时数据存储空间,在 Windows 上右键点击计算机,再点击属性时,上面显示的安装内存(RAM)就是电脑的物理内存。这些内存是实际存在的,在你不给机器增加内存条的时候是不会改变的。

    2)交换内存通常在页面调度和交换进程数据时使用,相当于在进行内存整理的时候,会先把部分数据放在硬盘的某块区域。类似我们整理衣柜,衣服一多直接整理会很麻烦,因此会先把部分衣服拿出来放在其它地方,等衣柜里的衣服整理完了,再把放在其它地方的衣服拿回来。

    这个其它地方在计算机中则代表硬盘的某块区域,也就是我们所说的交换区。通常使用交换内存是因为物理内存不足导致的,正所谓衣柜,如果足够大的话就没必要拿出部分衣服放在其它地方, 直接在衣柜里就能解决了。

    3)最后是虚拟内存,当操作文件,可执行程序等等,那么首先要把它们从磁盘读取到内存中,因此 CPU 除了自己那一部分小小的空间外,要想操作数据,只能操作内存里的数据。

    但是当内存不够了,那么会在硬盘上开辟一份虚拟内存,将物理内存里的部分数据放在虚拟内存当中。硬盘的空间很大,即使普通电脑安装的固态硬盘也有一百个 G,因此可以拿出一部分充当虚拟内存。

    不过虚拟内存虽说是内存,但毕竟在硬盘上,速度和 CPU 直接从物理内存里读取数据相差甚远。这也是为什么要将经常被访问的热点数据放在 Redis 缓存里,而不是放在硬盘或者数据库上。

    磁盘相关

    查看磁盘分区、磁盘使用率和磁盘 IO 信息

    import psutil
    
    print(psutil.disk_partitions())
    """
    [sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260),
     sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260),
     sdiskpart(device='E:\\', mountpoint='E:\\', fstype='NTFS', opts='rw,fixed', maxfile=255, maxpath=260)]
    """

    可以看到一共有三个盘符,fstype 表示文件系统类型,这里是 NTFS;opts 中的 rw 表示可读写。

    该函数还可以接收一个参数 all,默认为 False。如果指定为 True,在 Linux 上返回的内容还会包含 /proc 等特殊文件系统的挂载信息。由于我这里是 Windows,所以两者没区别。

    查看某个磁盘使用情况

    import psutil
    
    print(psutil.disk_usage("C:\\"))
    """
    sdiskusage(total=267117391872, 
               used=96894304256, 
               free=170223087616, 
               percent=36.3)
    """

    查看磁盘 IO 统计信息

    import psutil
    
    print(psutil.disk_io_counters())
    """
    sdiskio(read_count=1172461, 
            write_count=2153031, 
            read_bytes=36854982144, 
            write_bytes=52718300160, 
            read_time=551, 
            write_time=1437)
    """
    • read_count :读次数

    • write_count:写次数

    • read_bytes:读的字节数

    • write_bytes:写的字节数

    • read_time:读时间

    • write_time:写时间

    以上返回的是所有磁盘加起来的统计信息,我们可以指定 perdisk=True,分别列出每一个分区的统计信息。

    网络相关

    查看网卡的网络 IO 统计信息

    import psutil
    
    print(psutil.net_io_counters())
    """
    snetio(bytes_sent=175995567, 
           bytes_recv=2849015622, 
           packets_sent=1052206, 
           packets_recv=3050302, 
           errin=0, 
           errout=0, 
           dropin=3491, 
           dropout=0)
    """
    # bytes_sent: 发送的字节数
    # bytes_recv: 接收的字节数
    # packets_sent: 发送的包数据量
    # packets_recv: 接收的包数据量
    # errin: 接收包时, 出错的次数
    # errout: 发送包时, 出错的次数
    # dropin: 接收包时, 丢弃的次数
    # dropout: 发送包时, 丢弃的次数
    
    # 里面还有一个 pernic 参数
    # 如果为 True, 则列出所有网卡的信息
    print(psutil.net_io_counters(pernic=True))
    """
    {'以太网': snetio(bytes_sent=178716616, 
                     bytes_recv=2866823348, 
                     packets_sent=1058190, 
                     packets_recv=3102852, 
                     errin=0, errout=0, 
                     dropin=3491, dropout=0), 
    'WLAN': snetio(bytes_sent=0, bytes_recv=0, 
                   packets_sent=0, packets_recv=0, 
                   errin=0, errout=0, 
                   dropin=0, dropout=0), 
    '本地连接* 3': snetio(bytes_sent=0, bytes_recv=0, 
                        packets_sent=0, packets_recv=0, 
                        errin=0, errout=0, 
                        dropin=0, dropout=0), 
    '本地连接* 4': snetio(bytes_sent=0, bytes_recv=0, 
                         packets_sent=0, packets_recv=0,
                         errin=0, errout=0, 
                         dropin=0, dropout=0), 
    '蓝牙网络连接': snetio(bytes_sent=0, bytes_recv=0, 
                        packets_sent=0, packets_recv=0,
                        errin=0, errout=0, 
                        dropin=0, dropout=0), 
    'Loopback Pseudo-Interface 1': snetio(bytes_sent=0, 
                                          bytes_recv=0, 
                                          packets_sent=0, 
                                          packets_recv=0, 
                                          errin=0, errout=0, 
                                          dropin=0, dropout=0)}
    """

    查看网络接口信息

    import psutil
    
    # 以字典的形式返回网卡的配置信息
    # 包括 IP 地址、Mac地址、子网掩码、广播地址等等
    print(psutil.net_if_addrs())
    """
    {'以太网': [
        snicaddr(family=, 
                 address='9C-7B-EF-15-FC-2F', netmask=None, 
                 broadcast=None, ptp=None), 
        snicaddr(family=, 
                 address='192.168.4.150', netmask='255.255.240.0', 
                 broadcast=None, ptp=None), 
        snicaddr(family=, 
                 address='fe80::4826:a6a6:b5f4:3647', 
                 netmask=None, broadcast=None, ptp=None)], 
    
    'WLAN': [...], 
    '本地连接* 3': [...], 
    '本地连接* 4': [...], 
    '蓝牙网络连接': [...], 
    'Loopback Pseudo-Interface 1': [...]}
    """
    
    # 返回网卡的详细信息, 包括是否启动、通信类型、传输速度、mtu
    print(psutil.net_if_stats())
    """
    {'以太网': snicstats(isup=True, 
                        duplex=, 
                        speed=1000, mtu=1500), 
    '蓝牙网络连接': snicstats(isup=False, 
                            duplex=, 
                            speed=3, mtu=1500), 
    'Loopback Pseudo-Interface 1': snicstats(isup=True, 
                                             duplex=, 
                                             speed=1073, mtu=1500), 
    'WLAN': snicstats(isup=False, 
                      duplex=, 
                      speed=0, mtu=1500), 
    '本地连接* 3': snicstats(isup=False, 
                            duplex=, 
                            speed=0, mtu=1500), 
    '本地连接* 4': snicstats(isup=False, 
                            duplex=, 
                            speed=0, mtu=1500)}
    """

    查看当前机器的网络连接

    import psutil
    
    # 以列表的形式返回每个网络连接的详细信息
    # 里面接受一个参数, 默认是 "inet"
    # 当然我们也可以指定为其它, 比如 "tcp"
    print(psutil.net_connections())
    """
    [sconn(fd=-1, family=, 
           type=, 
           laddr=addr(ip='192.168.4.150', port=137), 
           raddr=(), status='NONE', pid=4),
     sconn(fd=-1, family=, 
           type=, 
           laddr=addr(ip='127.0.0.1', port=54872), 
           raddr=(), status='NONE', pid=11652),
     sconn(fd=-1, family=, 
           type=, 
           laddr=addr(ip='192.168.4.150', port=11253), 
           raddr=addr(ip='117.50.19.136', port=80), 
           status='CLOSE_WAIT', pid=11568),
     ....
     ....
     ....
    ]
    """

    是不是很方便呢?在 Linux 中有两个命令可以做到这一点,分别是 netstat 和 ss。另外该函数会返回所有的连接信息,所以当连接数很多的时候,会占用较高的内存。

    查看当前登录的用户信息

    import psutil
    
    print(psutil.users())
    """
    [suser(name='satori', terminal=None, host='0.0.0.0', 
           started=1609841661.0, pid=None)]
    """

    查看系统的启动时间

    import psutil
    from datetime import datetime
    
    print(psutil.boot_time())  # 1654012221.2945454
    print(
        datetime.fromtimestamp(psutil.boot_time())
    )  # 2022-05-31 23:50:21.294545

    进程管理

    psutil 还提供了很多和进程管理相关的功能函数,非常的丰富,我们来看一下。

    查看当前存在的所有进程的 pid

    import psutil
    
    print(psutil.pids())
    """
    [0, 4, 148, 532, 668, 796, 904, 912, 976, ...]
    """

    查看某个进程是否存在

    import psutil
    
    print(psutil.pid_exists(22333))  # False
    print(psutil.pid_exists(532))  # True

    返回所有进程(Process)对象组成的迭代器

    import psutil
    
    print(psutil.process_iter())
    """
    
    """
    
    # 遍历的话,会得到每一个进程对象
    # 进程对象在 psutil 里面的类型是 Process

    根据 pid 获取一个进程对应的 Process 对象

    import psutil
    
    print(psutil.Process(14124))
    """
    psutil.Process(pid=14124, name='WeChat.exe', 
                   status='running', started='10:54:43')
    """
    # 进程名称是 WeChat.exe,状态为运行中
    # 启动时间是早上 10 点 54 分

    进程管理操作

    我们说根据 pid 可以获取一个进程对应的 Process 对象,而这个对象里面包含了该进程的全部信息。

    import psutil
    
    p = psutil.Process(14124)
    
    # 进程名称
    print(p.name())
    """
    WeChat.exe
    """
    
    # 进程的exe路径
    print(p.exe())
    """
    D:\WeChat\WeChat.exe
    """
    
    # 进程的工作目录
    print(p.cwd())
    """
    D:\WeChat
    """
    
    # 进程启动的命令行
    print(p.cmdline())
    """
    ['D:\\WeChat\\WeChat.exe']
    """
    
    # 当前进程id
    print(p.pid)
    """
    14124
    """
    
    # 父进程id
    print(p.ppid())
    """
    8860
    """
    
    # 父进程
    print(p.parent())
    """
    psutil.Process(pid=8860, name='explorer.exe', 
                   status='running', started='10:53:58')
    """
    
    # 子进程列表
    print(p.children())
    """
    [psutil.Process(pid=6852, name='WechatBrowser.exe', 
                    status='running', started='10:54:59'), 
     psutil.Process(pid=1960, name='WeChatPlayer.exe',
                    status='running', started='10:54:59'), 
     psutil.Process(pid=10432, name='WeChatApp.exe', 
                    status='running', started='10:55:33')]
    """
    
    # 进程状态
    print(p.status())
    """
    running
    """
    
    # 进程用户名
    print(p.username())
    """
    LAPTOP-264ORES3\satori
    """
    
    # 进程创建时间,返回时间戳
    print(p.create_time())
    """
    1654570483.2370846
    """
    
    # 进程终端
    # 在windows上无法使用
    try:
        print(p.terminal())
    except Exception as e:
        print(e)
    """
    'Process' object has no attribute 'terminal'
    """
    
    # 进程使用的cpu时间
    print(p.cpu_times())
    """
    pcputimes(user=27.8125, system=13.484375,
              children_user=0.0, children_system=0.0)
    """
    
    # 进程所使用的的内存
    print(p.memory_info())
    """
    pmem(rss=110141440, vms=116899840, 
         num_page_faults=661356, peak_wset=221048832, 
         wset=110141440, peak_paged_pool=834824, 
         paged_pool=806216, peak_nonpaged_pool=144584, 
         nonpaged_pool=78560, pagefile=116899840, 
         peak_pagefile=197505024, private=116899840)
    """
    
    # 进程打开的文件
    print(p.open_files())
    
    # 进程相关的网络连接
    print(p.connections())
    """
    [pconn(fd=-1, family=, 
           type=, 
           laddr=addr(ip='192.168.4.150', port=7693), 
           raddr=addr(ip='58.251.111.106', port=8080), 
           status='ESTABLISHED'), 
     pconn(fd=-1, family=, 
           type=, 
           laddr=addr(ip='127.0.0.1', port=8680), 
           raddr=(), status='LISTEN')]
    """
    
    # 进程内的线程数量,这个进程开启了多少个线程
    print(p.num_threads())  # 58
    
    # 这个进程内的所有线程信息
    print(p.threads())
    """
    [pthread(id=14128, user_time=11.3125, system_time=7.578125), 
     pthread(id=13428, user_time=0.0, system_time=0.0), 
     pthread(id=13616, user_time=0.0, system_time=0.0), 
     pthread(id=13600, user_time=0.015625, system_time=0.328125),
     pthread(id=7364, user_time=0.078125, system_time=0.015625),
     ... 
     ]
    """
    
    # 进程的环境变量
    print(p.environ())
    
    # 结束进程
    # 执行之后微信就会被强制关闭, 这里就不试了
    # p.terminal()

    我们还可以调用 psutil.test 来模拟 ps 命令。

    import psutil
    
    psutil.test()

    输出如下:

    如何使用Python的psutil模块获取系统的硬件、网络和进程信息

    它是怎么做的呢?还记得我们之前说的 process_iter 吗?会返回所有进程的 Process 对象,直接依次输出里面的信息即可。同理,我们也可以通过 process_iter 找到某一个进程对应的进程 id。

    import psutil
    
    for prcs in psutil.process_iter():
        if prcs.name().lower() == "wechat.exe":
            print(prcs)
    """
    psutil.Process(pid=14124, name='WeChat.exe', 
                   status='running', started='10:54:43')
    """

    有了这个操作之后,我们便可以找到对应的进程,然后借助操作系统的 kernal 修改进程内部的数据。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Python
    相关文章 更多
    python删除一个列表里的重复元素的方法与代码示例
    python删除一个列表里的重复元素的方法与代码示例

    学习如何使用Python高效删除列表中的重复元素。本文提供5种常见方法的代码示例,涵盖保持顺序与不保持顺序的场景,适合初学者和进阶开发者参考。

    Python写接口的步骤及完整代码示例
    Python写接口的步骤及完整代码示例

    详细讲解使用Python编写Web接口的核心步骤与完整代码示例,涵盖环境准备、路由定义、数据校验、服务启动及调试测试方法。

    codex怎么读取word文档及docx文件操作教程
    codex怎么读取word文档及docx文件操作教程

    介绍如何利用编程工具读取和解析Word文档(docx格式),涵盖基础文本提取代码示例、结构化数据处理逻辑,以及处理复杂排版时的技术局限与替代方案。

    怎么在Python中调用C语言代码提升性能
    怎么在Python中调用C语言代码提升性能

    详细讲解在Python中调用C语言代码提升性能的完整实践指南,包含原理分析、编译步骤、ctypes与CFFI具体实现、性能对比及常见陷阱。

    Python与C语言的性能差异及底层原理
    Python与C语言的性能差异及底层原理

    深入解析Python与C语言在执行效率上的数量级差异,从编译机制、变量内存布局、动态类型推断到GIL锁,系统阐明底层核心原理。

    Python和C语言哪个更适合编程入门
    Python和C语言哪个更适合编程入门

    客观对比Python与C语言在心智负担、底层机制与学习反馈上的核心差异,提供清晰有据的选择标准与切实的入门学习路径。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    langgraph python guide中文入门教程详解
    langgraph python guide中文入门教程详解

    本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

    Windows 安装 Python:从官方入口到虚拟环境的可复现实践
    Windows 安装 Python:从官方入口到虚拟环境的可复现实践

    面向后端开发者,基于 Python 官方文档说明如何在 Windows 上安装 Python、创建 venv 虚拟环境及使用 pip 管理依赖。包含可复制命令、验证方法及工具选择边界,避免常见配置误区。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。