0. 背景和需求

就日常工作而言,查看电脑当前状态的是一个非常低频的需求,所以即便市面上已经有各种监控软件,依然觉得解决方案过于繁重。但近日确实遇到了需要查看当前网速的场景,我不希望为此安装一个软件,也不希望因此占据工具栏,因此考虑使用轻量级的脚本工具解决。

1. 实现思路

1.1 网速监控公式

经查阅,发现有一个叫psutil的 Python 模块可以实现网络监控。我们要统计网速,无非是 计算在一秒的时间段内,网络流量的变化情况。

psutil的网速监控模块文档说明
psutil的网速监控模块文档说明

## 该函数写法如下
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 psutilpip3 install firepip3 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 设置

  1. 触发形式: 无所谓,我使用 Command + N (代表 network)
  2. 循环逻辑: 因为查看网速时,会希望看到网速变化,这样才能完成对网速的整体评估,设置5次循环比较合理
  3. 执行方法: 选择执行 shell 脚本,python3解析器位置 + 脚本目录
    KM设置截图
    KM设置截图

如果不知道 python3 解析器位置,可以打开终端,输入 which python3 。which 这个命令可以在 PATH 变量里帮你找到。

小提示:可以在终端使用 which 命令找到 python3 解析器
小提示:可以在终端使用 which 命令找到 python3 解析器

从上图所示,我的 python3 解析器位置是 /anaconda3/bin/python3,然后这个脚本的路径又是在 /Users/patrick/CodeLab/net_speed_test.py。所以我的写法就是 /anaconda3/bin/python3 /Users/patrick/CodeLab/net_speed_test.py

小提示2: 如果依然失败,可以把这个脚本直接添加为可执行脚本。

  1. 打开终端,输入 chmod +x 脚本路径.py (后面是脚本路径,例如 /Users/patrick/CodeLab/net_speed_test.py)
  2. 完成后,在 KM 中选择 Excute script file
    成功添加为可执行脚本后,可以直接执行
    成功添加为可执行脚本后,可以直接执行
  3. 点击 try 可以进行尝试,在右侧的 display results briefly 也可以进行其他展示形式的调整。

4. 最终效果

在任意位置触发快捷键,在接下来的5秒,脚本就会自动计算当前网速,以通知的形式弹出。

点击 Command + N,右上角通知显示网速
点击 Command + N,右上角通知显示网速

5. 延伸阅读

psutil 文档
Python Fire 文档

6
2