如何在 python 中设置 protobuf 字段或属性

How to set protobuf fields or attributes in python

我有 protobuf 编译文件,我有 json 数据,我想从 protobuf complied class 访问字段并设置 json objet[=14= 的值]

这是我编译的代码,由于编译代码很大,我刚刚添加了描述符部分


_STATUSMSG = _descriptor.Descriptor(
  name='StatusMsg',
  full_name='RBAT.PRS.StatusMsg',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  create_key=_descriptor._internal_create_key,
  fields=[
    _descriptor.FieldDescriptor(
      name='id', full_name='RBAT.PRS.StatusMsg.id', index=0,
      number=1, type=13, cpp_type=3, label=2,
      has_default_value=False, default_value=0,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='tag', full_name='RBAT.PRS.StatusMsg.tag', index=1,
      number=2, type=9, cpp_type=9, label=2,
      has_default_value=False, default_value=b"".decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='type_type', full_name='RBAT.PRS.StatusMsg.type_type', index=2,
      number=3, type=14, cpp_type=8, label=2,
      has_default_value=False, default_value=1,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='control_mode', full_name='RBAT.PRS.StatusMsg.control_mode', index=3,
      number=4, type=11, cpp_type=10, label=2,
      has_default_value=False, default_value=None,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='interface_status', full_name='RBAT.PRS.StatusMsg.interface_status', index=4,
      number=5, type=14, cpp_type=8, label=2,
      has_default_value=False, default_value=0,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='config_type', full_name='RBAT.PRS.StatusMsg.config_type', index=5,
      number=6, type=14, cpp_type=8, label=2,
      has_default_value=False, default_value=0,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
    _descriptor.FieldDescriptor(
      name='software_version', full_name='RBAT.PRS.StatusMsg.software_version', index=6,
      number=7, type=9, cpp_type=9, label=2,
      has_default_value=False, default_value=b"".decode('utf-8'),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
  ],

来自sample.py

import from protos.status_msg_pb2 import StatusMsg
class Sample():
    def decode(self, json):
        v_status = StatusMsg()
        v_status["id"] = json["payload"]["id"]
        print(v_status.ByteSize())

我收到错误

*'module' object is not subscriptable* *emphasized text*

也许试试 v_status.id = json["payload"]["id"]

了解 id 字段的类型(int32int64string 等)会很有帮助。

我认为下标(即 ["id"])仅适用于 struct 的字段。

这可能会有帮助:https://developers.google.com/protocol-buffers/docs/reference/python-generated#fields