Python psutil 模块详解:系统资源监控与进程管理实战

沿途有光
沿途有光
发布时间:2026-10-12| 2人浏览过
原创

本文详解Python第三方库psutil的核心用法,涵盖获取CPU、内存、磁盘及网络接口状态的方法。通过实际代码演示如何利用该模块跨平台监控系统指标,并重点讲解安全终止指定进程的正确姿势(含跨平台兼容方案),帮助开发者快速实现系统级运维与性能监控功能。

安装与环境准备

psutil是一个跨平台的进程和系统监控模块,支持Linux、Windows、macOS等主流操作系统。使用前需通过pip安装:

pip install psutil

监控系统资源状态

第一步:获取CPU利用率与核心数

通过cpu_count()可区分逻辑核心与物理核心,cpu_percent()能实时返回CPU负载率。示例代码如下:

>>> import psutil
>>>> psutil.cpu_count()  # 逻辑核心数
4
>>>> psutil.cpu_count(logical=False)  # 物理核心数
2
# 物理2核+超线程产生4逻辑核
>>>> psutil.cpu_times()
scputimes(user=10963.31, nice=0.0, system=5138.67, idle=356102.45)

若需类似 top 命令的滚动监控,可配合循环刷新:

>>> for _ in range(10):
...     print(psutil.cpu_percent(interval=1, percpu=True))
[14.0, 4.0, 4.0, 4.0]
[12.0, 3.0, 4.0, 3.0]
# ...后续数据依次输出

第二步:采集内存与交换分区

系统物理内存与虚拟交换区可通过以下函数读取,返回值均为字节(int)。代码注释已标注换算逻辑:

>>> mem = psutil.virtual_memory()
>>>> svmem(total=8589934592, available=2866520064, percent=66.6, used=7201386496, free=216178688)
# total约8GB,已用约6.7GB,占用率66.6%
>>>> swap = psutil.swap_memory()
>>>> sswap(total=1073741824, used=150732800, free=923009248, percent=14.0)

第三步:检查磁盘分区与IO统计

盘符挂载点、容量余量及读写计数是磁盘健康度评估的关键:

>>> psutil.disk_partitions()
[sdiskpart(device='/dev/disk1', mountpoint='/', fstype='hfs', opts='rw,...')]
>>>> psutil.disk_usage('/')
sdiskusage(total=998982549504, used=390880133120, free=607840272384, percent=39.1)
# 总容量约930GB,已用39.1%,文件系统支持日志(journaled)
>>>> psutil.disk_io_counters()
sdiskio(read_count=988513, write_count=274457, read_bytes=..., write_bytes=...)

第四步:读取网络接口与流量计数器

网络收发包统计及接口属性可查看通信活跃度:

>>> psutil.net_io_counters()
snetio(bytes_sent=3885744870, bytes_recv=10357676702, packets_sent=..., packets_recv=...)
>>>> psutil.net_if_addrs()
{'en1': [snic(family=, address='10.0.1.80', netmask='255.255.255.0')]}
>>>> psutil.net_if_stats()
{'en1': snicstats(isup=True, duplex=, speed=0, mtu=1500)}

注意:获取活跃网络连接net_connections()需要管理员权限。普通用户运行会抛出AccessDenied。在终端使用sudo python3重新进入交互环境即可正常获取:

$ sudo python3
Password: ******
>> import psutil
>> psutil.net_connections()
[sconn(fd=83, family=, type=1, laddr=..., raddr=..., status='ESTABLISHED', pid=3725)]

进程管理与信息采集

psutil通过psutil.pids()列出所有进程ID,并结合psutil.Process(pid)对象深入查询单个进程属性:

>>> p = psutil.Process(3776)
>>>> p.name()          # 'python3.6'
>>>> p.exe()           # '/Users/michael/anaconda3/bin/python3.6'
>>>> p.cwd()           # '/Users/michael'
>>>> p.cmdline()       # ['python3']
>>>> p.ppid()          # 父进程ID 3765
>>>> p.status()        # 'running'
>>>> p.username()      # 'michael'
>>>> p.memory_info()   # pmem(rss=8310784, vms=2481725440)
>>>> p.cpu_times()     # pcputimes(user=0.081, system=0.053)
>>>> p.num_threads()   # 1
>>>> p.environ()       # {'PATH': '/usr/local/bin...', 'LANG': 'zh_CN.UTF-8'}

若想快速预览全系统进程快照,可直接调用内置测试接口,效果近似命令行工具ps aux:

# 需提前使用sudo启动python
>>> psutil.test()
USER         PID %MEM     VSZ     RSS TTY           START    TIME  COMMAND
root           0 24.0 74270628 2016380 ?             Nov18   40:51  kernel_task
root           1  0.1 2494140    9484 ?             Nov18   01:39  launchd

安全结束指定进程

⚠️ 风险提醒:强制终止进程可能导致数据未保存或依赖服务异常。执行前请确认目标进程非系统关键组件,并建议先备份重要工作文件。

基于psutil的优雅终止(推荐)

该方法遍历进程池,匹配名称后发送终止信号。相比直接kill,它能给予进程清理现场的机会:

import psutil
import os

def kill_process_by_name(process_name: str) -> None:
    '''根据进程名查找并终止对应进程'''
    for proc in psutil.process_iter(['pid', 'name']):
        try:
            attrs = proc.as_dict(attrs=['pid', 'name'])
            if attrs['name'] == process_name:
                parent_pid = proc.parent().ppid()
                print(f'发现目标进程: {attrs}')
                print(f'父进程PID: {parent_pid}')
                # 优雅终止(允许处理SIGTERM信号)
                proc.terminate()  
                # proc.kill()  # 若响应超时可改用强制杀掉
                break
        except (psutil.NoSuchProcess, psutil.AccessDenied):
            pass

操作系统原生命令回退方案

不同平台对进程控制的实现存在差异,可根据运行环境切换策略:

  • Windows环境:推荐使用subprocess调用系统命令taskkill,参数/f代表强制结束:
    import subprocess
    def win_kill(name):
        cmd = f'taskkill /f /im {name}'
        subprocess.call(cmd, shell=True)
  • Unix/Linux/macOS环境:直接使用内置os.kill发送信号,参数9对应SIGKILL(强制不可拦截):
    import os
    def unix_kill(pid):
        os.kill(pid, 9)
        print(f"PID {pid} 已被强制终结。")

简要总结

掌握psutil的基础调用后,开发者可轻松构建轻量级系统监控面板或自动化运维脚本。通过合理组合CPU/内存/磁盘/网络API,配合跨平台进程控制逻辑,能够覆盖绝大多数底层资源管理场景。以上就是利用 Python psutil 模块进行系统资源监控与进程管理的详细内容,更多关于 Python 系统级编程与性能优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。