使用Python实时监控下载速度并实现自动关机功能
解决实时网络下载速度监控与自动关机需求
替代speedtest-cli的实时监控方案
speedtest-cli仅支持单次测速,无法持续追踪动态流量变化。要准确获取实时下载速度,直接读取系统网络接口的流量统计数据是最可靠的方式。
方案一:跨平台实时流量采集(基于psutil)
使用psutil库可以跨Linux、macOS、Windows读取系统网络IO统计,通过定期采集接收字节数的增量计算实时速度,代码简洁且稳定。
示例代码:
import time import psutil import os def calculate_realtime_speed(interval=1): # 获取初始接收字节数 prev_recv = psutil.net_io_counters().bytes_recv time.sleep(interval) # 获取当前接收字节数 curr_recv = psutil.net_io_counters().bytes_recv # 计算速度(转换为KB/s) speed = (curr_recv - prev_recv) / interval / 1024 return round(speed, 2) # 核心监控逻辑 if __name__ == "__main__": # 连续检测次数,避免临时波动误触发 low_speed_count = 0 threshold = 0.1 # 接近0的阈值,过滤微小后台流量 check_interval = 5 while True: current_speed = calculate_realtime_speed() print(f"当前下载速度: {current_speed} KB/s") if current_speed < threshold: low_speed_count += 1 if low_speed_count >= 3: # 执行关机命令,根据系统调整: # Linux/macOS: "shutdown -h now" # Windows: "shutdown /s /t 0" os.system("shutdown -h now") break else: low_speed_count = 0 time.sleep(check_interval)
方案二:Linux原生文件解析(无需第三方库)
如果不想依赖第三方库,可以直接读取/proc/net/dev文件解析指定网卡的接收流量:
import time import os def get_nic_recv_bytes(nic="eth0"): with open("/proc/net/dev", "r") as f: for line in f: if nic in line: parts = line.split() return int(parts[1]) return 0 # 监控逻辑同方案一,替换calculate_realtime_speed函数即可
关键注意事项
- 阈值与连续检测:不要直接判断速度为0,系统后台可能存在微小流量;建议连续3次检测低于阈值再执行关机,避免临时网络波动误操作。
- 权限要求:执行关机命令需要管理员/root权限,应用需以对应权限启动。
- 网卡指定:多网卡设备需通过
psutil.net_io_counters(pernic=True)获取各网卡数据,选择当前活跃的网卡进行监控。
优化建议
- 添加倒计时取消机制:检测到低速度时弹出提示,倒计时1分钟后关机,允许用户手动取消。
- 记录监控日志:将速度数据和操作记录写入文件,方便后续排查问题。
内容的提问来源于stack exchange,提问作者user21251189
相关产品推荐
相关产品推荐

