应使用shutil.disk_usage()传入明确挂载点路径(如"/"或"c:")获取total、used、free字节值,计算使用率int(100 * used / total),配合异常捕获、时间戳日志与动态阈值预警。

如何用 shutil.disk_usage() 实时检查磁盘剩余空间
Python 标准库的 shutil.disk_usage() 是最轻量、最可靠的方式,它直接调用系统级接口(Linux/Windows/macOS 都支持),不依赖外部命令或第三方包。传入一个路径(比如 '/' 或 'C:\'),返回命名元组,含 total、used、free 三个字节值。
注意:不能传相对路径或不存在的目录;Windows 下路径末尾加不加反斜杠不影响,但必须是有效挂载点(如 'D:' 可以,'D:\nonexistent' 会抛 OSError)。
常见误用是拿日志文件所在目录(如 './logs')去查——这查的是当前工作目录所在分区,不是你认为的那个“日志盘”。应明确指定根路径或挂载点。
设置合理阈值并触发预警的典型写法
预警不是等 free == 0 才响,而是预留缓冲。建议按百分比(如 free / total )或绝对值(如 <code>free 表示少于 2GB)判断,二者结合更稳妥——小磁盘用百分比,大磁盘(如 10TB)需防百分比失敏。
实操建议:
- 把检查逻辑封装成函数,接收路径和阈值(单位字节或 float),返回
True表示低于阈值 - 在关键写入前调用(如打开新日志文件、保存模型权重前),而不是仅靠定时轮询
- 首次预警后加个冷却时间(如 30 分钟内不再重复告警),避免刷屏
- 预警信息里务必包含
shutil.disk_usage(path)的原始free和total值,方便运维快速定位是容量真见底,还是某进程占满临时目录
捕获 OSError 时区分“空间不足”和其他磁盘错误
OSError 是个大类,磁盘空间不足对应的是 errno.ENOSPC(Linux/macOS)或 Windows 下的 ERROR_DISK_FULL(对应 winerror=112)。不能一概 except OSError: 就发告警,否则权限拒绝、设备未就绪、路径不存在都会被误判。
正确做法:
- 用
import errno,然后if e.errno == errno.ENOSPC: - Windows 下需额外处理:
if hasattr(e, 'winerror') and e.winerror == 112: - 写入失败时再检查一次磁盘(因为可能刚被其他进程清出空间),避免误报
示例片段:
try:
with open('output.bin', 'wb') as f:
f.write(data)
except OSError as e:
if e.errno == errno.ENOSPC or (hasattr(e, 'winerror') and e.winerror == 112):
warn_disk_full('/path/to/write')
else:
raise
为什么不用 os.statvfs() 或 psutil.disk_usage()
os.statvfs() 功能类似,但 Windows 不支持,跨平台项目要额外分支处理;psutil 虽然接口更友好(带百分比、单位换算),但它启动时会加载 C 扩展,首次调用有毫秒级延迟,在高频写入场景(如实时数据管道)中可能拖慢关键路径。
除非你已经在用 psutil 做其他系统监控,否则没必要为磁盘预警单独引入它。标准库的 shutil.disk_usage() 在 Python 3.3+ 全平台可用,零依赖、无冷启开销。
真正容易被忽略的是:某些容器环境(如 Docker)中,应用看到的根路径 '/' 是容器文件系统,而实际瓶颈可能在宿主机的 /var/lib/docker。这时得根据部署方式,把预警路径指向绑定卷宿主机路径(比如 '/host_data'),而不是盲目查 '/'。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











