在 Python 中使用 Protocol Buffers (protobuf) 主要涉及三个步骤:

- 安装 Protobuf 编译器 (
protoc):这是将.proto文件编译成各种语言(包括 Python)代码的工具。 - 安装 Python Protobuf 库 (
protobuf):这是 Python 运行时库,用于处理编译后的 Protobuf 消息。 - 编写
.proto文件:定义你的数据结构。 - 使用
protoc编译.proto文件:生成 Python 代码。 - 在 Python 代码中导入并使用生成的消息类。
第一步:安装 Protobuf 编译器 (protoc)
protoc 是一个独立的二进制文件,不是通过 Python 的 pip 安装的,你需要根据你的操作系统来安装它。
在 macOS 上 (推荐使用 Homebrew)
这是最简单的方式。
# 安装 protoc brew install protobuf # 安装 protoc 的 Python 插件 (可选,但推荐) brew install protoc-gen-go
安装完成后,验证 protoc 是否安装成功:
protoc --version # 应该输出类似 libprotoc 21.12 的信息
在 Linux (Ubuntu/Debian) 上
# 更新包列表 sudo apt update # 安装 protobuf 编译器和其他必要的依赖 sudo apt install -y protobuf-compiler
同样,验证安装:

protoc --version
在 Windows 上
-
下载预编译的二进制文件:
- 访问 Protobuf 的 GitHub 发布页面:https://github.com/protocolbuffers/protobuf/releases
- 找到 "protoc-
-win64.zip" 或 "protoc- -win32.zip" 并下载。
-
配置环境变量:
- 解压下载的 ZIP 文件到一个固定位置,
C:\tools\protoc-<version>。 - 将
bin目录(C:\tools\protoc-<version>\bin)添加到系统的PATH环境变量中。- 右键点击 "此电脑" -> "属性" -> "高级系统设置" -> "环境变量"。
- 在 "系统变量" 中找到
Path,点击 "编辑"。 - 点击 "新建",然后添加你的
bin目录路径。 - 确认所有对话框并重启你的终端(CMD 或 PowerShell)。
- 解压下载的 ZIP 文件到一个固定位置,
-
验证安装:
protoc --version
第二步:安装 Python Protobuf 库 (protobuf)
这一步使用 Python 的包管理器 pip,在你的终端或命令行中运行:

# 强制升级到最新版本,推荐使用 v3.19.0 或更高版本以获得最佳兼容性 pip install --upgrade protobuf
为了方便后续的编译步骤,我们还需要安装 grpcio-tools,它包含了 protoc 的 Python 插件。
pip install grpcio-tools
第三步:编写 .proto 文件
创建一个名为 addressbook.proto 的文件,内容如下,这个文件定义了一个简单的消息 Person。
// addressbook.proto
syntax = "proto3"; // 指定使用 proto3 语法
package tutorial; // 定义一个包名,用于防止命名冲突
// 定义 Person 消息
message Person {
string name = 1;
int32 id = 2; // 唯一ID
string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
string number = 1;
PhoneType type = 2;
}
repeated PhoneNumber phones = 4; // repeated 关键字表示这是一个数组
}
// 定义一个 AddressBook 消息,其中包含多个 Person
message AddressBook {
repeated Person people = 1;
}
第四步:使用 protoc 编译 .proto 文件
这是最关键的一步,你需要告诉 protoc 如何编译你的文件,并为 Python 生成代码。
确定输出目录
创建一个目录来存放生成的 Python 代码,我们会创建一个名为 pb 的目录。
mkdir pb
执行编译命令
在终端中,导航到你的 .proto 文件所在的目录,然后运行以下命令:
# 命令格式: protoc --python_out=<输出目录> <你的.proto文件> protoc --python_out=pb addressbook.proto
命令解释:
protoc: 调用编译器。--python_out=pb: 指定输出语言为 Python,并将生成的文件放到pb目录中。addressbook.proto: 要编译的输入文件。
编译成功后,你会在 pb 目录下看到两个新文件:
pb/addressbook_pb2.py: 这是最重要的文件,它包含了 Python 类的定义,用于表示你在.proto文件中定义的消息。pb/__init__.py: 一个空文件,它告诉 Pythonpb是一个包。
第五步:在 Python 代码中使用生成的类
你可以编写一个 Python 脚本来创建、序列化和反序列化 Protobuf 消息了。
创建一个名为 main.py 的文件,内容如下:
# main.py
# 1. 导入生成的类
from pb import addressbook_pb2
def create_address_book():
"""创建并填充一个 AddressBook 消息"""
# 2. 创建 Person 消息对象
person = addressbook_pb2.Person()
person.id = 1234
person.name = "John Doe"
person.email = "jdoe@example.com"
# 3. 为 person 添加电话号码
phone = person.phones.add()
phone.number = "555-4321"
phone.type = addressbook_pb2.Person.PhoneType.HOME
# 4. 创建 AddressBook 消息对象并添加 person
address_book = addressbook_pb2.AddressBook()
address_book.people.extend([person])
return address_book
def serialize_and_print(address_book):
"""序列化 AddressBook 并打印其二进制表示"""
# 5. 序列化消息为二进制字符串 (bytes)
serialized_data = address_book.SerializeToString()
print("序列化后的二进制数据:")
print(serialized_data)
print(f"数据长度: {len(serialized_data)} bytes")
# 6. 从二进制字符串反序列化回消息对象
new_address_book = addressbook_pb2.AddressBook()
new_address_book.ParseFromString(serialized_data)
# 7. 验证反序列化后的数据
print("\n反序列化后的数据:")
print(f"Name: {new_address_book.people[0].name}")
print(f"ID: {new_address_book.people[0].id}")
print(f"Email: {new_address_book.people[0].email}")
print(f"Phone: {new_address_book.people[0].phones[0].number} (Type: {new_address_book.people[0].phones[0].type})")
if __name__ == "__main__":
my_address_book = create_address_book()
serialize_and_print(my_address_book)
运行脚本
确保你的终端在 main.py 和 pb 文件所在的目录下,然后运行:
python main.py
预期输出
你应该会看到类似下面的输出:
序列化后的二进制数据:
b'\n\x0cJohn Doe\x10\xd2\x04\x1a\x0cjdoe@example.com"\x0c\x555-4321\x18\x01'
数据长度: 39 bytes
反序列化后的数据:
Name: John Doe
ID: 1234
Email: jdoe@example.com
Phone: 555-4321 (Type: HOME)
常见问题与解决方法
Q1: protoc: command not found
原因: protoc 编译器没有安装,或者没有正确添加到系统的 PATH 环境变量中。
解决: 请返回第一步,确保你的操作系统已正确安装 protoc 并且终端可以找到它。
Q2: ImportError: No module named 'google.protobuf'
原因: Python Protobuf 运行时库 (protobuf) 没有安装。
解决: 返回第二步,运行 pip install --upgrade protobuf。
Q3: ImportError: No module named 'pb.addressbook_pb2'
原因: Python 找不到生成的模块,这通常是由于以下原因之一:
- 目录结构错误: 确保
pb目录和main.py在同一个父目录下。 - 执行目录错误: 你必须在包含
pb目录的父目录中运行python main.py。 __init__.py文件缺失: 确保pb目录下有一个空的__init__.py文件,使其成为一个合法的 Python 包。
Q4: 编译 .proto 文件时出现错误,如 Invalid include path
原因: protoc 找不到 .proto 文件中 import 的其他 .proto 文件。
解决: 如果你的 .proto 文件导入了其他文件,你需要使用 -I (或 --proto_path) 参数来指定搜索路径。
protoc -I=. --python_out=pb addressbook.proto
这告诉 protoc 在当前目录 () 中查找被导入的 .proto 文件。
安装和使用 Python Protobuf 的核心流程是:
- 全局安装
protoc(非 Python 环境)。 - Python 环境安装
protobuf和grpcio-tools(pip install ...)。 - 编写
.proto定义文件。 - 用
protoc --python_out=<dir> <file>编译。 - 在代码中
from pb import xxx_pb2并使用生成的类。
遵循以上步骤,你就可以顺利地在你的 Python 项目中集成 Protocol Buffers 了。
