如何在python中访问协议缓冲区自定义选项?

如何在python中访问协议缓冲区自定义选项?,python,protocol-buffers,Python,Protocol Buffers,我按照中的说明创建自定义消息选项。我使用了他们的示例,但收到一个错误: Traceback (most recent call last): File "test_my_opt.py", line 2, in <module> value = my_proto_file_pb2.MyMessage.DESCRIPTOR.GetOptions().Extensions[my_proto_file_pb2.my_option] File "(...)\google\pro

我按照中的说明创建自定义消息选项。我使用了他们的示例,但收到一个错误:

Traceback (most recent call last):
  File "test_my_opt.py", line 2, in <module>
    value = my_proto_file_pb2.MyMessage.DESCRIPTOR.GetOptions().Extensions[my_proto_file_pb2.my_option]
  File "(...)\google\protobuf\internal\python_message.py", line 1167, in __getitem__
    _VerifyExtensionHandle(self._extended_message, extension_handle)
  File "(...)\google\protobuf\internal\python_message.py", line 170, in _VerifyExtensionHandle
    message.DESCRIPTOR.full_name))
KeyError: 'Extension "my_option" extends message type "google.protobuf.MessageOptions", but this message is of type "google.protobuf.MessageOptions".'
这个原始文件:

import "beans-protobuf/proto/src/descriptor.proto";

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

message MyMessage {
  option (my_option) = "Hello world!";
}
一切都像在指南里那么我应该如何正确访问此选项?

我认为这就是问题所在。描述符.proto的正确导入语句是:

import "google/protobuf/descriptor.proto";
路径字符串很重要,因为您需要扩展描述符类型的原始定义,而不是它们的副本
google/protobuf/descriptor.proto
成为Python中的模块
google.protobuf.descriptor\u pb2
,protobuf库希望任何自定义选项都是其中类型的扩展。但实际上您正在扩展
beansprotobuf/proto/src/descriptor.proto
,它在Python中变成了
beans\u protobuf.proto.src.descriptor\u pb2
,这是一个完全不同的模块!因此,protobuf库变得混乱,认为这些扩展不适用于protobuf描述符


我想如果你只是改变进口声明,一切都应该正常。正确安装protobuf后,
google/protobuf/descriptor.proto
应始终作为导入文件使用——无需提供您自己的文件副本。

非常感谢!这正是问题所在。所以对于其他任何人,在扩展消息时不要更改此导入。
import "beans-protobuf/proto/src/descriptor.proto";
import "google/protobuf/descriptor.proto";