如何在Python中通过grpc_tools.protoc.main()解码.pb文件内容
解决grpc_tools.protoc在Python中解码.pb文件的问题
问题根源
你之前的尝试失败,是因为protoc的--decode模式默认从标准输入(stdin)读取二进制.pb数据,而不是通过命令行参数接收.pb文件路径。把.pb文件路径加到参数里,工具会把它当成.proto文件解析,自然触发报错。
正确实现方式
在Python中,我们需要临时替换sys.stdin为目标.pb文件,同时替换sys.stdout为输出的文本文件,再调用grpc_tools.protoc.main()。具体代码如下:
import sys import grpc_tools.protoc # 配置参数 PROTO_PATH = "./relative/path/to/proto" PROTO_FILE = "file.proto" MESSAGE_TYPE = "a.b.message_type" PB_FILE_PATH = "path/to/file.pb" OUTPUT_TXT_PATH = "file.txt" # 临时替换标准输入输出 with open(PB_FILE_PATH, "rb") as pb_file, open(OUTPUT_TXT_PATH, "w") as txt_file: # 保存原stdin/stdout original_stdin = sys.stdin original_stdout = sys.stdout try: sys.stdin = pb_file sys.stdout = txt_file # 调用protoc,参数里不需要加pb文件路径 grpc_tools.protoc.main([ "protoc", f"--decode={MESSAGE_TYPE}", f"--proto_path={PROTO_PATH}", PROTO_FILE ]) finally: # 恢复原stdin/stdout,避免影响后续代码 sys.stdin = original_stdin sys.stdout = original_stdout
关键说明
- 参数列表只需要指定.proto相关配置(
--proto_path和.proto文件名),不需要加.pb文件路径,因为二进制数据会从stdin读取。 - 必须以二进制模式(
rb)打开.pb文件,匹配其二进制存储格式。 - 用
try...finally确保无论是否报错,都能恢复原标准输入输出。 - 确保
MESSAGE_TYPE是proto文件中定义的全限定消息类型(格式如package.name.MessageName)。
内容的提问来源于stack exchange,提问作者lauragrass
相关产品推荐
相关产品推荐

