Python protoc生成代码中访问外部导入Protobuf自定义选项失败问题
问题原因
- 扩展访问路径不符合定义结构
你在metadata3.proto中对google.protobuf.MessageOptions的扩展是嵌套结构:首先定义了自定义消息MessageOptionsMetadata3,内部包含message_options_field1等子字段,再将message_options_metadata3(类型为MessageOptionsMetadata3)作为扩展字段注册到MessageOptions。你原来的代码直接把message_options_field1当成顶层扩展键,自然匹配不到。 - 扩展定义的归属模块错误
message_options_metadata3这个扩展是在metadata3.proto中定义的,对应的Python符号在metadata3_pb2模块下,你尝试从my_proto_file_pb2中获取该字段,肯定找不到对应定义。 - 额外的protoc命令错误
你原编译命令中的--plugin参数使用错误:该参数是用来指定protoc的自定义代码生成插件二进制文件的,不是用来导入已生成的pb2文件的,错误的参数可能会导致编译产物异常。
解决方法
- 修正protoc编译命令
# 先编译依赖的metadata3.proto protoc -I=./protos --python_out=./protos_generated ./protos/metadata3.proto # 再编译业务proto文件 protoc -I=./protos --python_out=./protos_generated ./protos/my_proto_file.proto
- 调整自定义选项访问代码
首先确保protos_generated目录已加入Python的模块搜索路径,再按嵌套结构访问:
import sys sys.path.append("./protos_generated") import metadata3_pb2 import my_proto_file_pb2 # 先取顶层扩展对象 msg_options = my_proto_file_pb2.MyMessage.DESCRIPTOR.GetOptions() ext_obj = msg_options.Extensions[metadata3_pb2.message_options_metadata3] # 再取扩展对象内部的子字段 value = ext_obj.message_options_field1
内容的提问来源于stack exchange,提问作者maverickz
相关产品推荐
相关产品推荐

