Python3运行系统监控脚本报TypeError需bytes对象而非str求助
报错根因
Python 3 环境下subprocess.check_output()方法默认返回bytes字节类型结果,而非字符串类型。你获取到的cpu_value为b'44.0\n'格式的字节对象,调用.rstrip('\n')时传入的是字符串类型的'\n',但字节对象的rstrip方法仅接受字节类参数,因此触发类型错误。
注意:脚本中disk_percent()函数对hdd_data的处理逻辑完全一致,当前仅在cpu_temp()步骤触发报错是因为代码执行顺序到这里就中断了,修复时需要同步处理该位置,否则会触发相同报错。
修复方法
二选一即可,推荐使用第一种方案,更符合常规字符串处理逻辑:
方案1:将字节结果解码为字符串
拿到check_output返回值后,调用decode()方法将字节流转为utf-8编码的普通字符串,再做后续截断、类型转换操作。
修改后的cpu_temp()函数代码:
def cpu_temp(): cpu_comm = "sensors |grep 'Core 0' |awk '{print $3}'|sed 's/\+//g;s/°C//g'" cpu_value = subprocess.check_output(cpu_comm, shell=True).decode('utf-8') json_key['cpu_temp'] = float(cpu_value.rstrip('\n'))
同步修改disk_percent()函数:
def disk_percent(): cmd_uptime = "df -h |grep sda1| awk '{print $5}'| sed 's/%//g'" hdd_data = subprocess.check_output(cmd_uptime, shell=True).decode('utf-8') json_key['hdd_percent'] = float(hdd_data.rstrip('\n'))
方案2:传入字节类型的截断参数
如果不想做解码,直接给rstrip()传入带b前缀的字节类型换行符即可:
# cpu_temp函数对应行修改为 json_key['cpu_temp'] = float(cpu_value.rstrip(b'\n')) # disk_percent函数对应行同步修改为 json_key['hdd_percent'] = float(hdd_data.rstrip(b'\n'))
额外代码问题修正
你的脚本里还有两处逻辑问题,建议同步修复:
used_mem()函数中定义的mem_cmd变量从未被使用,属于冗余代码;当前取值mem_used.total >> 20拿到的是总内存大小,和函数名要取已用内存的目标不符,应改为mem_used.used >> 20- 依赖shell命令取磁盘、CPU温度的写法兼容性差,不同机器的磁盘分区名、sensors输出格式变化都会导致脚本运行失败,可以直接使用
psutil库内置的磁盘、传感器相关接口获取数据,稳定性更高。
内容的提问来源于stack exchange,提问作者WirthmS
相关产品推荐
相关产品推荐

