详解Python Google Protocol Buffer

本文详细介绍了在Python中如何使用Google Protocol Buffer(PB),包括其用途、安装方法、自定义.proto文件、编译、解析、序列化与反序列化,以及处理更复杂Message的方法。PB作为结构化数据交换格式,具有简单快速的优点,常用于日志服务。文章还涵盖了动态编译和嵌套及导入Message的概念。
摘要由CSDN通过智能技术生成

本篇主要介绍如何在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文件开头是包的声明,为了帮助防止在不同的工程中

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值