AWS Lambda运行ZabbixSender出现str与bytes拼接报错该如何解决
问题根因
你遇到的是Python2与Python3的字符串/字节类型不兼容问题,你当前使用的ZabbixSender源码是基于Python2开发的,而AWS Lambda的Python3运行环境中,字符串(str)和字节(bytes)是完全独立的类型,无法直接拼接、混用。
两次报错的具体逻辑
- 第一次报错
TypeError: can only concatenate str (not "bytes") to str:__request方法中response变量初始值为字符串类型"",而socket接收的data是bytes类型,二者直接拼接触发类型错误。 - 第二次报错
a bytes-like object is required, not 'str':你将data解码为str后和response拼接,得到的response整体为str类型,但struct.unpack方法只能接收bytes类型的入参,因此触发新错误。
解决方案
方案1:修改原有ZabbixSender源码(适配Python3)
仅需修改1行初始化代码即可,无需修改拼接、解包逻辑:
- 找到
ZabbixSender.py中__request方法的response变量初始化行 - 将原来的
response = ""修改为response = b""
修改后response全程为bytes类型,既可以和socket返回的data直接拼接,也符合后续struct.unpack的入参要求,两个报错会同时解决。
方案2:直接使用已适配Python3的ZabbixSender依赖
不需要自行修改源码,直接使用PyPi官方维护的pyzabbix库即可:
- 本地安装依赖:
pip install pyzabbix -t ./python - 将安装生成的
python目录打包为Lambda层,绑定到你的Lambda函数即可直接调用
注意:如果Lambda运行环境为Python3.9及以上版本,需确保pyzabbix版本≥1.3.0,避免其他兼容问题。
内容的提问来源于stack exchange,提问作者user630702
相关产品推荐
相关产品推荐

