目录
- 核心概念简介
- 安装步骤
- 步骤 1: 安装 Protocol Buffers 编译器 (
protoc) - 步骤 2: 安装 Python Protobuf 库 (
protobuf)
- 步骤 1: 安装 Protocol Buffers 编译器 (
- 一个完整的示例
- 第 1 步: 定义
.proto文件 - 第 2 步: 编译
.proto文件生成 Python 代码 - 第 3 步: 在 Python 中使用生成的代码
- 第 1 步: 定义
- 常见问题与解决方案
核心概念简介
在开始之前,我们先理解两个核心组件:

protoc(Protocol Buffer Compiler): 这是 Protocol Buffers 的编译器,它的作用是读取你用.proto语言定义的数据结构,然后根据你指定的目标语言(如 Python, Java, C++ 等),生成对应语言的类代码文件,你只需要安装一次这个编译器。protobuf(Python 库): 这是 Python 的运行时库,当你使用protoc编译完.proto文件后,你的 Python 代码需要导入这个库来序列化(将对象转换为字节流)和反序列化(将字节流还原为对象)数据。
protoc 是“代码生成器”,protobuf 库是“代码运行时引擎”。
安装步骤
步骤 1: 安装 Protocol Buffers 编译器 (protoc)
protoc 是一个独立的工具,不依赖于 Python,你需要为你的操作系统单独安装它。
方法一: 从 GitHub Releases 下载 (推荐)
这是最通用和推荐的方法,适用于所有主流操作系统。

-
访问下载页面: https://github.com/protocolbuffers/protobuf/releases
-
选择版本: 建议下载最新的稳定版本。
-
下载对应平台的文件:
- Windows: 下载
protoc-<version>-win64.zip(或win32.zip),解压后,将bin目录(protoc-27.1-win64\bin)添加到系统的PATH环境变量中。 - macOS (Intel/Apple Silicon): 下载
protoc-<version>-osx-<arch>.zip(protoc-27.1-osx-universal.zip或protoc-27.1-osx-aarch_64.zip),解压后,将bin目录(protoc-27.1-osx-x86_64/bin)添加到系统的PATH环境变量中。 - Linux (Debian/Ubuntu):
# 更新包列表 sudo apt update # 安装 protoc 和其依赖 sudo apt install -y protobuf-compiler
- Linux (CentOS/RHEL/Fedora):
# 安装 DNF (如果尚未安装) sudo yum install dnf # 安装 protoc sudo dnf install -y protobuf-compiler
- Windows: 下载
-
验证安装: 打开一个新的终端(或命令提示符),运行以下命令,如果能看到版本号,说明安装成功。
protoc --version # 应该输出类似 libprotoc 27.1 的信息
步骤 2: 安装 Python Protobuf 库 (protobuf)
这个库通过 pip 安装,非常简单。
- 打开终端/命令行。
- 运行安装命令:
pip install protobuf
- 验证安装: 你可以运行 Python 并尝试导入库来验证。
python -c "import google.protobuf; print(google.protobuf.__version__)" # 应该输出安装的版本号,4.25.1
一个完整的示例
现在我们通过一个简单的例子来走完整个流程。
第 1 步: 定义 .proto 文件
创建一个名为 addressbook.proto 的文件,内容如下,这个文件定义了一个 Person 消息类型。
// addressbook.proto
syntax = "proto3";
package tutorial;
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' 关键字表示这是一个列表
}
message AddressBook {
repeated Person people = 1;
}
第 2 步: 编译 .proto 文件生成 Python 代码
假设你的 addressbook.proto 文件在 C:\projects\my_project 目录下。
-
打开终端/命令行,并导航到该目录。
# Windows cd C:\projects\my_project # macOS / Linux cd /path/to/your/project
-
运行
protoc命令:protoc --python_out=. addressbook.proto
--python_out=.: 这个标志告诉protoc为 Python 语言生成代码,并将输出文件(.py文件)放在当前目录 ()。addressbook.proto: 这是要编译的输入文件。
-
检查输出: 编译成功后,你会发现在当前目录下多了一个名为
addressbook_pb2.py的文件,这个文件就是protoc为你生成的 Python 类,包含了Person和AddressBook的定义。不要手动修改这个文件!
第 3 步: 在 Python 中使用生成的代码
我们创建一个新的 Python 脚本(create_address_book.py)来使用这个生成的 addressbook_pb2.py。
# create_address_book.py
# 1. 导入生成的模块
import addressbook_pb2
# 2. 创建一个 Person 对象
person = addressbook_pb2.Person()
person.id = 1234
person.name = "John Doe"
person.email = "jdoe@example.com"
# 3. 为这个 person 添加电话号码
phone = person.phones.add() # 'add()' 方法用于向 'repeated' 字段添加元素
phone.number = "555-4321"
phone.type = addressbook_pb2.Person.HOME # 使用枚举类型
# 4. 创建另一个 Person
another_person = addressbook_pb2.Person()
another_person.id = 5678
another_person.name = "Jane Smith"
another_person.email = "jsmith@example.com"
another_phone = another_person.phones.add()
another_phone.number = "555-1234"
another_phone.type = addressbook_pb2.Person.WORK
# 5. 创建一个 AddressBook 并将 person 添加进去
address_book = addressbook_pb2.AddressBook()
address_book.people.extend([person, another_person])
# 6. 序列化 (Serialize) 对象到二进制字符串
# .SerializeToString() 将消息对象转换为字节串
serialized_data = address_book.SerializeToString()
print("数据已序列化,长度为:", len(serialized_data))
# 7. 将二进制数据写入文件
with open("addressbook.dat", "wb") as f:
f.write(serialized_data)
print("数据已保存到 addressbook.dat")
# 8. 从文件中读取并反序列化 (Deserialize)
with open("addressbook.dat", "rb") as f:
serialized_data_from_file = f.read()
# 9. 创建一个空的 AddressBook 对象
new_address_book = addressbook_pb2.AddressBook()
# 10. 将字节串解析到新的对象中
new_address_book.ParseFromString(serialized_data_from_file)
# 11. 验证数据
print("\n从文件中读取并解析的数据:")
for p in new_address_book.people:
print(f" 姓名: {p.name}, ID: {p.id}, 邮箱: {p.email}")
for phone_num in p.phones:
print(f" 电话: {phone_num.number} (类型: {phone_num.type})")
运行这个脚本:
python create_address_book.py
预期输出:
数据已序列化,长度为: 158
数据已保存到 addressbook.dat
从文件中读取并解析的数据:
姓名: John Doe, ID: 1234, 邮箱: jdoe@example.com
电话: 555-4321 (类型: 1)
姓名: Jane Smith, ID: 5678, 邮箱: jsmith@example.com
电话: 555-1234 (类型: 2)
(注意:枚举的数字输出 1 和 2 对应 HOME 和 WORK)
常见问题与解决方案
-
问题:
'protoc' 不是内部或外部命令...- 原因:
protoc的安装路径没有被添加到系统的PATH环境变量中。 - 解决: 将
protoc的bin目录(C:\protoc-27.1-win64\bin)添加到系统的PATH环境变量,你需要重启终端才能生效。
- 原因:
-
问题:
ModuleNotFoundError: No module named 'google.protobuf'- 原因: Python 的
protobuf库没有安装。 - 解决: 确保你已经在正确的 Python 环境中运行了
pip install protobuf,如果你在使用虚拟环境,请先激活它。
- 原因: Python 的
-
问题:
ImportError: cannot import name 'descriptor' from 'google.protobuf'- 原因: 这是一个非常常见的问题,通常发生在
protoc编译器版本和protobufPython 库版本不匹配时,特别是当你有一个非常旧的protoc,但用pip安装了新版的protobuf时。 - 解决: 强烈建议保持
protoc编译器和protobufPython 库的版本同步或兼容,一个简单的策略是使用较新的版本,如果你安装了protoc 27.1,那么用pip install protobuf安装的库通常也是兼容的。
- 原因: 这是一个非常常见的问题,通常发生在
- 安装
protoc: 从官网下载或用包管理器安装,确保protoc --version命令可用。 - 安装
protobuf库: 在你的 Python 环境中运行pip install protobuf。 - 定义
.proto文件: 使用 Protocol Buffer 语法定义你的数据结构。 - 编译: 使用
protoc --python_out=. your_file.proto生成 Python 代码 (_pb2.py文件)。 - 使用: 在 Python 脚本中导入生成的
_pb2.py文件,创建对象,使用.SerializeToString()和.ParseFromString()进行序列化和反序列化。
遵循以上步骤,你就可以在 Python 项目中成功使用 Protocol Buffers 了。
