You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:14:57