Protocol buffers--python 实践(一) 简介以及安装与使用

由于最近对grpc产生了浓厚的兴趣,但是那是一整套东西,看了一下用到的东西不少,所以抽丝剥茧先写写这几天调研的protocol buffer -python的收获。

 

简介:

以下引用自官方首页文档:

Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages.

Protocol Buffers以下简称pb,是google开发的一个可以序列化 反序列化object的数据交换格式,类似于xml,但是比xml 更轻,更快,更简单。而且以上的重点突出一个跨平台,和xml json等数据序列化一样,跨平台跨语言。

 

现在pb正处在换代的时期,google 2016年7月28日证实发布了version3.0正式宣布从2.x以及3.x 各种alpha-beta版本跨越至正式版。相关文档还在积极跟进中。从pb的官方网站可以看到,已经有pb3的language guide了,而且相关tutorials的各主要语言的实现也在积极跟进之中。 就是因为这点,3.x文档还不够完善,所以现在还是在学习和使用2.x。不过2.x的python版本实现似乎并不是特别好,经过测试比json慢很多,但是有办法可以解决这个问题,后面会提到。

 

安装:

1. 前往github:https://github.com/google/protobuf/releases 下载最新版本的对应语言的pb,比如这里我是python 所以我会下载。

protobuf-python-3.1.0.zip

2. 下载完毕之后运行包中自带config文件。

3. make&&make install。

4. 之后便可以使用命令 protoc --version 查看安装完毕的版本号。

(grpc)piperck➜  python  ᐅ  protoc --version
libprotoc 3.0.0

这里可以继续安装c++ 实现 for python 可以提升序列化和反序列化的性能。

5. 进入python文件夹 

6. Build and run the tests

python setup.py build
python setup.py test

7. 安装

python setup.py install --cpp_implementation

使用c++ for python的实现要比pure python 实现快10倍左右。是非常大的性能差距。

 

另外安装方面也可以直接安装grpc:

pip install grpcio
pip install grpcio-tools

然后会安装pb依赖,grpc_tools.protoc工具就是protocol buffer.

 

使用:

归根到底,pb还是一个序列化反序列化工具,那么使用上来说其实我个人认为是没有json那么简单的,但是却可以保证即使是在python这种动态语言中,数据类型也不会出现错误。他的使用需要定义一个.proto文件,该文件里面会定义号数据类型和格式。我在这里就不再搬运各语言对应的字段,因为这些官方文档中都写的非常清楚。这里直接上最简单的使用。

首先在say_hi.proto文件中定义一个需要在代码中传递的数据结构:

syntax = "proto2";

package hello_word;

message SayHi {
    required int32 id = 1;
    required string something = 2;
    optional string extra_info = 3;
}

然后使用命令

protoc -I . --python_out=. hello_world.say_hi.proto

在当前路径下面生成一个say_hi_pb2.py文件。

-I 是指定.proto文件所在路径。

--python_out 输出生成好的pb2.py文件所在路径。

后面参数指定使用哪个.proto文件。

 

之后我们就可以愉快的使用这个生成好的文件的类进行数据序列化反序列化了。使用例子如下:

# coding: utf-8
import say_hi_pb2

po = say_hi_pb2.SayHi()
po.id = 123
po.something = 'do_something'
po.extra_info = 'xiba'

bilibili = po.SerializeToString()

oo = say_hi_pb2.SayHi()
oo.ParseFromString(bilibili)
print oo.id
print oo.something
print oo.extra_info

输出:
123 do_something xiba

以上。

 

 

Reference:

https://developers.google.com/protocol-buffers/  protocol-buffers offcial doc

http://blog.csdn.net/handsomekang/article/details/17484139 飘逸的python - 使用protocal buffers

 

posted @ 2017-01-16 16:31  piperck  阅读(15897)  评论(0编辑  收藏  举报