Plugins 自定义协议插件解析不适用于自定义选项
我正在尝试编写一个protoc插件,它要求我使用自定义选项。我定义了自定义选项,如示例所示: 我的用法如下: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
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 {
}
}