本篇主要介绍如何在Python语言中使用Google Protocol Buffer(后续都简写为PB), 包括以下几个部分:
- 为什么要使用PB?
- 安装Google PB
- 自定义.proto 文件
- 编译.proto文件
- 解析目标py文件
- 序列化和反序列化
- 更复杂的Message
- 动态编译
为什么要使用PB?
PB(Protocol Buffer)是 Google 开发的用于结构化数据交换格式,作为腾讯云日志服务标准写入格式。因此用于写入日志数据前,需要将日志原始数据序列化为 PB 数据流后通过 API 写入服务端。而各个端类程序中不便操作PB格式,因此需要在端类和日志服务之间加入一层PB转化层。
当然PB格式也有自己的优点,主要是简单和快,具体测试结果参见Google序列化基准分析
安装Google PB
如果要想在Python中使用PB,需要先安装PB编译器protoc去编译你的.proto文件,安装方法如下:
下载最新的protobuf release包安装即可,当前版本为3.5.1,安装步骤如下
wget https://github.com/google/protobuf/releases/download/v3.5.1/protobuf-all-3.5.1.tar.gz
tar xvfz protobuf-all-3.5.1.tar.gz
cd protobuf-3.5.1/
./configure --prefix=/usr
make
make check
make install
check步骤全部通过即表示编译通过。
继续安装protobuf的python模块
cd ./python
python setup.py build
python setup.py test
python setup.py install
安装完成验证protoc
命令
root@ubuntu:~# protoc --version
libprotoc 3.5.1
protobuf的默认安装位置是 /usr/local,/usr/local/lib 不在Ubuntu系统默认的 LD_LIBRARY_PATH 里,如果在Ubuntu系统中configure时未指定安装路径为/usr
, 则会出现以下错误
protoc: error while loading shared libraries: libprotoc.so.8: cannot open shared object file: No such file or directory
可以使用ldconfig
命令解决,参考Protobuf cannot find shared libraries,这个错误在安装包的README中有提到。当然重新安装也可以
验证Python模块是否被正确安装
import google.protobuf
在python解释器中如果上面的import没有报错,说明安装正常。
自定义.proto 文件
首先我们需要编写一个 proto 文件,定义我们程序中需要处理的结构化数据,在 protobuf 的术语中,结构化数据被称为 Message。proto 文件非常类似 java 或者 C++ 语言的数据定义。proto示例文件cls.Log.proto
如下:
syntax = "proto2";
package cls;
message Log
{
optional uint64 time = 1; // UNIX Time Format
required string topic_id = 2;
required string content = 3;
}
.proto文件开头是包的声明,为了帮助防止在不同的工程中