2

我正在尝试编写一个需要我使用自定义选项的 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版本有问题?

4

2 回答 2

5

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

  • 将您的自定义选项放入文件 my_custom.proto
  • 使用 protoc 从 my_custom.proto => my_custom_pb2.py 生成 python 文件
  • 在您的 python 插件代码中,导入 my_custom_pb2.pyimport my_custom_pb2
于 2019-12-12T09:53:36.863 回答
4

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

于 2017-07-07T14:53:22.703 回答