自定义protoc插件解析不适用于自定义选项

时间:2017-07-05 16:43:01

标签: plugins protocol-buffers options protoc

我正在尝试编写一个protoc插件,要求我使用自定义选项。我定义了我的自定义选项,如示例(https://developers.google.com/protocol-buffers/docs/proto#customoptions)中所示:

import "google/protobuf/descriptor.proto";

extend google.protobuf.MessageOptions {
    string my_option = 51234;
}

我按如下方式使用它:

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

    option (my_option) = "telephone";
}

但是,当我读取已解析的请求时,选项字段为" Hello"消息。

我正在做以下阅读

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版本有问题吗?

2 个答案:

答案 0 :(得分:1)

事实证明,您需要为定义了自定义选项的.proto文件导入_pb2.py文件。例如,您正在解析一个名为ParseFromString的文件(使用example.proto),该文件使用option.proto中定义的自定义选项,您必须在调用的Python文件中导入option_pb2.py ParseFromString

答案 1 :(得分:0)

我正在制作protobuf python插件。 我也遇到了像您一样的问题,并且我已经找到了解决方案。

  • 将自定义选项放入文件my_custom.proto
  • 使用协议从my_custom.proto => my_custom_pb2.py生成python文件
  • 在您的python插件代码中,导入my_custom_pb2.py import my_custom_pb2