上面代码运行结果显示AttributeError: 'snetio' object has no attribute 'percent'
时间: 2023-07-14 09:10:45 浏览: 149
抱歉,我在之前的回答中犯了一个错误。`psutil.net_io_counters()` 返回的对象 `snetio` 没有 `percent` 属性,因此会导致 `AttributeError: 'snetio' object has no attribute 'percent'` 错误。
如果你想要获取网络IO的占用率,你可以使用其他方法,如计算上一次和当前的网络IO差值,并计算百分比。
以下是修改后的示例代码:
```python
import psutil
import time
# 设置阈值(示例阈值为50%)
cpu_threshold = 50
ram_threshold = 50
disk_threshold = 50
net_threshold = 50
# 获取初始网络IO数据
net_io_prev = psutil.net_io_counters()
while True:
for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_percent']):
pid = proc.info['pid']
name = proc.info['name']
cpu_percent = proc.info['cpu_percent']
ram_percent = proc.info['memory_percent']
# 获取磁盘IO信息
disk_io_c = psutil.disk_io_counters(perdisk=True).get('C:')
disk_io_d = psutil.disk_io_counters(perdisk=True).get('D:')
disk_percent_c = disk_io_c.percent if disk_io_c else 0
disk_percent_d = disk_io_d.percent if disk_io_d else 0
# 获取当前网络IO数据
net_io_curr = psutil.net_io_counters()
# 计算网络IO占用率
net_bytes_sent = net_io_curr.bytes_sent - net_io_prev.bytes_sent
net_bytes_recv = net_io_curr.bytes_recv - net_io_prev.bytes_recv
net_percent = (net_bytes_sent + net_bytes_recv) / (net_io_curr.bytes_sent + net_io_curr.bytes_recv) * 100
# 更新上一次的网络IO数据
net_io_prev = net_io_curr
# 判断是否超过阈值
if cpu_percent > cpu_threshold or ram_percent > ram_threshold or disk_percent_c > disk_threshold or disk_percent_d > disk_threshold or net_percent > net_threshold:
current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(f"异常报警:进程ID {pid}, 进程名称 {name}")
print(f"异常发生时间:{current_time}")
print(f"CPU 占用率:{cpu_percent}%")
print(f"内存 占用率:{ram_percent}%")
print(f"C 盘磁盘 占用率:{disk_percent_c}%")
print(f"D 盘磁盘 占用率:{disk_percent_d}%")
print(f"网络 IO 占用率:{net_percent}%")
print("---------------------------------")
# 每隔一段时间进行检测(示例为5秒)
time.sleep(5)
```
在修改后的代码中,我们通过计算当前网络IO和上一次网络IO的差值,然后根据总的发送和接收字节数计算出网络IO的占用率。这样就可以避免了使用 `percent` 属性的问题。
请注意,这只是一个示例代码,具体的计算方法可能需要根据你的需求进行调整。
阅读全文