os模块无法获取实时内存和cpu使用率,需用psutil:virtual_memory().available返回当前可用字节数,cpu_percent(interval=1)需两次调用才有效,避免手动分支调用系统命令。

os模块本身无法获取内存和CPU信息
直接用 os 模块拿不到可用内存或 CPU 使用率——它没提供这类接口。os 里的 os.statvfs 只管磁盘,os.cpu_count() 最多返回逻辑 CPU 核心数(静态值),不反映实时负载或内存状态。想跨平台拿到“可用内存”或“当前 CPU 占用”,必须换库。
psutil 是最稳妥的跨平台方案
psutil 封装了各系统底层调用(Linux 的 /proc/meminfo、Windows 的 GlobalMemoryStatusEx、macOS 的 host_statistics),API 统一且行为一致。安装后即可用:
pip install psutil
关键点:
-
psutil.virtual_memory()返回命名元组,.available字段是**当前可用字节数**(不是“空闲”,而是系统认为可立即分配的内存) -
psutil.cpu_percent(interval=1)必须指定interval(秒),首次调用返回 0.0,需至少两次调用才有意义 - 不要用
psutil.cpu_count(logical=False)当物理核心数——某些 Windows 系统可能误报,更可靠的是读/proc/cpuinfo(Linux)或sysctl -n hw.physicalcpu(macOS),但这就脱离跨平台了
避免用 platform 或 sys.platform 做手动分支
有人试图根据 sys.platform 切换命令行调用(比如 Linux 跑 free -b,Windows 跑 wmic memorychip get Capacity),这会引入一堆问题:
- 解析命令输出格式不稳定(不同 locale 下单位缩写可能变)
- 子进程启动开销大,频繁调用拖慢程序
- wmic 在 Win11 某些版本已弃用,PowerShell 替代方案又得处理执行策略
- 权限问题:macOS 上
top -l1需要全盘访问权限才能读取其他进程 CPU,普通脚本常被拦截
注意“可用内存”的语义陷阱
很多人以为 psutil.virtual_memory().available 是“没被占用的内存”,其实它包含内核缓存中可快速回收的部分(如 page cache)。真正影响程序能否 malloc 成功的是这个值,但监控告警时若按“剩余百分比
所以:
- 做资源调度(比如启动新进程前检查)→ 用
.available - 做长期趋势监控 → 建议同时看
.used和.buffers + .cached(Linux only),否则看不出缓存膨胀 - 跨平台统一口径 → 别碰
.free字段,它在 Windows 上含义和 Linux 完全不同
真实环境里,同一台机器上 psutil 和系统自带监控工具(如 htop、任务管理器)显示的“可用”数值略有差异,这是正常现象——统计时机与策略不同,只要量级一致就无需深究。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











