Python字典转Protobuf Message:Timestamp字段解析错误求助
问题解决:Protobuf 3.6.1 + Python 2.7 解析Timestamp字段报错
问题原因
你遇到的是Protobuf 3.6.1版本的已知bug——在Python 2.7环境下,ParseDict对带微秒的RFC3339格式时间字符串解析逻辑存在缺陷,会错误截断字符串,导致解析失败。
解决方案
方案1:手动转换时间字段(无需升级版本)
跳过ParseDict自动解析time字段,手动将时间字符串转换为google.protobuf.Timestamp对象后赋值:
from google.protobuf.json_format import ParseDict from google.protobuf.timestamp_pb2 import Timestamp import datetime tl_snapshot = {u'status': u'FAILED', u'level': u'TEST_COMPUTER', u'hostname': u'mfg-line12', u'time': u'2022-10-26T13:14:07.831052'} # 先解析除time外的字段 snapshot = log_pb2.LogStatusSnapshot() ParseDict({k: v for k, v in tl_snapshot.items() if k != 'time'}, snapshot) # 手动处理time字段 time_str = tl_snapshot['time'] dt = datetime.datetime.strptime(time_str, '%Y-%m-%dT%H:%M:%S.%f') timestamp = Timestamp() timestamp.seconds = int(dt.strftime('%s')) timestamp.nanos = dt.microsecond * 1000 # 微秒转纳秒 snapshot.time.CopyFrom(timestamp)
方案2:升级Protobuf版本(彻底解决)
如果项目允许,将Protobuf升级到3.10及以上版本,这些版本已经修复了Python 2.7下的时间字符串解析bug,升级后直接使用原来的ParseDict代码即可正常工作:
pip install --upgrade protobuf>=3.10.0
内容的提问来源于stack exchange,提问作者Tommy Clare
相关产品推荐
相关产品推荐

