0. 背景和需求
就日常工作而言,查看电脑当前状态的是一个非常低频的需求,所以即便市面上已经有各种监控软件,依然觉得解决方案过于繁重。但近日确实遇到了需要查看当前网速的场景,我不希望为此安装一个软件,也不希望因此占据工具栏,因此考虑使用轻量级的脚本工具解决。
1. 实现思路
1.1 网速监控公式
经查阅,发现有一个叫psutil的 Python 模块可以实现网络监控。我们要统计网速,无非是 计算在一秒的时间段内,网络流量的变化情况。

## 该函数写法如下
def net_speed_test():
## 我们首先计算一个网卡的当前流量
s1 = psutil.net_io_counters(pernic=True)['en0']
## 等待1秒,理论上也可以等待多秒,然后除掉这段时间
time.sleep(1)
## 再计算同一个网卡当前流量
s2 = psutil.net_io_counters(pernic=True)['en0']
## 因为我关心的是接收的网速,所以取 bytes_recv 作差
result = s2.bytes_recv - s1.bytes_recv
## 除以 1024,转化为 kb
return str(result/1024) + 'kb/s'
1.2 Python Fire
因为考虑到 KM 最终会通过命令行调用来触发这个脚本,所以考虑使用 Python Fire。Python Fire 是 Google 出的一个模块,可以把 Python 脚本里的对象封装成命令行可以调用的脚本。
2. 最终脚本编写
如果你还没有安装过这几个模块,还是要打开终端先安装:psutil、fire、time
分别输入pip3 install psutil、pip3 install fire、pip3 install time
脚本内容如下,保存为一个python文件。
#!/anaconda3/bin/python3
import psutil
import fire
import time
def net_speed_test():
s1 = psutil.net_io_counters(pernic=True)['en0']
time.sleep(1)
s2 = psutil.net_io_counters(pernic=True)['en0']
result = s2.bytes_recv - s1.bytes_recv
return str(result/1024) + 'kb/s'
if __name__ == '__main__':
fire.Fire(net_speed_test)
3. KM 设置
- 触发形式: 无所谓,我使用
Command + N(代表 network) - 循环逻辑: 因为查看网速时,会希望看到网速变化,这样才能完成对网速的整体评估,设置5次循环比较合理
- 执行方法: 选择执行 shell 脚本,
python3解析器位置+脚本目录
KM设置截图
如果不知道 python3 解析器位置,可以打开终端,输入 which python3 。which 这个命令可以在 PATH 变量里帮你找到。
小提示:可以在终端使用 which 命令找到 python3 解析器
从上图所示,我的 python3 解析器位置是 /anaconda3/bin/python3,然后这个脚本的路径又是在 /Users/patrick/CodeLab/net_speed_test.py。所以我的写法就是 /anaconda3/bin/python3 /Users/patrick/CodeLab/net_speed_test.py。
小提示2: 如果依然失败,可以把这个脚本直接添加为可执行脚本。
- 打开终端,输入 chmod +x 脚本路径.py (后面是脚本路径,例如 /Users/patrick/CodeLab/net_speed_test.py)
- 完成后,在 KM 中选择 Excute script file
成功添加为可执行脚本后,可以直接执行 - 点击 try 可以进行尝试,在右侧的 display results briefly 也可以进行其他展示形式的调整。
4. 最终效果
在任意位置触发快捷键,在接下来的5秒,脚本就会自动计算当前网速,以通知的形式弹出。




