Plugins 自定义协议插件解析不适用于自定义选项

Plugins 自定义协议插件解析不适用于自定义选项,plugins,protocol-buffers,options,protoc,Plugins,Protocol Buffers,Options,Protoc,我正在尝试编写一个protoc插件,它要求我使用自定义选项。我定义了自定义选项,如示例所示: 我的用法如下: message Hello { bool greeting = 1; string name = 2; int32 number = 3; option (my_option) = "telephone"; } 但是,当我读取解析的请求时,Hello消息的options字段为空 我正在做下面的阅读 data = sys.stdin.read() re

我正在尝试编写一个protoc插件,它要求我使用自定义选项。我定义了自定义选项,如示例所示:

我的用法如下:

message Hello {
    bool greeting = 1;
    string name = 2;
    int32 number = 3;

    option (my_option) = "telephone";
}
但是,当我读取解析的请求时,Hello消息的options字段为空

我正在做下面的阅读

data = sys.stdin.read()

request = plugin.CodeGeneratorRequest()
request.ParseFromString(data)
当我打印请求时,它只会给我这个

message_type {
  name: "Hello"
  field {
    name: "greeting"
    number: 1
    label: LABEL_REQUIRED
    type: TYPE_BOOL
    json_name: "greeting"
  }
  field {
    name: "name"
    number: 2
    label: LABEL_REQUIRED
    type: TYPE_STRING
    json_name: "name"
  }
  field {
    name: "number"
    number: 3
    label: LABEL_OPTIONAL
    type: TYPE_INT32
    json_name: "number"
  }
  options {
  }
}

如图所示,尽管我在.proto文件中定义了选项,但选项字段是空的。我定义自定义选项的语法是否不正确?或者可能是我的protoc版本有问题吗?

结果是需要为定义了自定义选项的.proto文件导入_pb2.py文件。例如,如果要使用名为example.proto的ParseFromString解析文件,该文件使用option.proto中定义的自定义选项,则必须在调用ParseFromString的Python文件中导入选项_pb2.py。

我正在制作protobuf Python插件。 我也遇到了和你一样的问题,我已经找到了解决办法

将自定义选项放入文件my_custom.proto 使用protoc从my_custom.proto=>my_custom_pb2.py生成python文件 在python插件代码中,导入my_custom_pb2.py导入my_custom_pb2
数据是选项对象的扩展。您使用过扩展API吗?您必须使用扩展API来读取自定义选项。要查看它是否在那里,您可以使用描述符集输出并将文件上载到-它将任何文件分开,以显示响应的所有字段标记,@marcGravel!我一直在搞乱扩展API,但无法让它列出对选项所做的扩展。这就是我目前所拥有的。您能帮我访问该对象中的元素吗?d=msg.DESCRIPTOR.GetOptions.Extensions,其中msg是我的proto文件中的一条消息well:您使用的是什么语言/框架?访问扩展的语法取决于此。这里有C++的例子:我使用Python,但是你提供的链接中的例子似乎不起作用。试图访问my_proto_文件\u pb2.my_选项时出错,显示AttributeError:'FileDescriptorProto'对象没有属性'my_option'。我是否需要使用protoc生成的文件来访问扩展名@这取决于您使用的框架;遗憾的是,我不能为python提供建议
message_type {
  name: "Hello"
  field {
    name: "greeting"
    number: 1
    label: LABEL_REQUIRED
    type: TYPE_BOOL
    json_name: "greeting"
  }
  field {
    name: "name"
    number: 2
    label: LABEL_REQUIRED
    type: TYPE_STRING
    json_name: "name"
  }
  field {
    name: "number"
    number: 3
    label: LABEL_OPTIONAL
    type: TYPE_INT32
    json_name: "number"
  }
  options {
  }
}