使用Curses的Python脚本nettop.py在macOS运行失败求助
解决macOS下运行psutil nettop.py脚本的报错问题
我之前在macOS上跑这个脚本也踩过类似的坑,结合报错信息(卡在bytes_recv的计算环节),大概率是macOS与Linux的psutil网络统计兼容性差异,或是老版本psutil的适配缺陷导致的,给你几个落地的解决思路:
1. 优先升级psutil到兼容Python3.6的最新版本
Python3.6.4属于比较老旧的版本,早期psutil对macOS的进程网络统计支持不完善。你可以安装适配Python3.6的最后一个psutil版本(5.9.5,因为5.9.6开始不再支持Python3.6):
pip install psutil==5.9.5
升级后再运行脚本,大部分情况下这个报错会直接消失——新版本psutil修复了不少macOS下的进程网络数据获取问题。
2. 修复脚本中的空值/属性缺失判断
如果升级后还是报错,那大概率是脚本没有处理macOS下部分进程无网络统计数据的情况(Linux上几乎所有进程都能返回网络统计,但macOS上部分系统进程会返回None)。
找到nettop.py第138行左右,把原来的计算代码改成下面的逻辑,先判断数据是否有效:
# 替换原有的recv计算代码 recv_bytes = 0 # 先确认stats_before和stats_after不为空,且存在bytes_recv属性 if stats_before and hasattr(stats_before, 'bytes_recv') and stats_after and hasattr(stats_after, 'bytes_recv'): recv_bytes = stats_after.bytes_recv - stats_before.bytes_recv recv = f"{recv_bytes}/s"
同理,发送字节数(bytes_sent)的计算也需要做同样的判断,避免触发同类报错。
3. 验证本地psutil的进程网络统计能力
可以先在终端运行下面的代码,确认macOS下psutil能否正常获取进程网络数据:
python -c "import psutil; p = psutil.Process(); print(p.net_io_counters())"
如果输出是None,说明当前进程没有网络活动数据,这也印证了脚本需要处理空值的必要性;如果输出包含bytes_recv和bytes_sent字段,那升级psutil应该就能解决问题。
内容的提问来源于stack exchange,提问作者anothernode
相关产品推荐
相关产品推荐

