python 使用protocol buffers参考指南

python protocol buffers 阅读:668

一。protobuf安装

  1. 下载最新的源文件https://github.com/google/protobuf
,我使用的版本是v2.6.1.zip


    下载gtest文件gtest-1.5.0.tar.gz,解压到protobuf-2.6.1下,并重命名为gtest。(执行autogen.sh脚本时会使用该文件)

  2. ./autogen.sh
    ./configure
    make
    make check
    make install

    检查是否安装完成

    protoc --version

    export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:/usr/local/lib64:/usr/lib64


  3. 安装python版本

    进入protobuf-2.6.1/python目录下




  4. python setup.py build
    python setup.py google_test
    python setup.py install

  进入python的IDE

  blob.png

  安装完成

二。使用protobuf完成前后端交互

  protobuf的格式网上有很多,参考地址http://www.jianshu.com/p/0dcef6fe11c8

  1.新建一个测试文件addressbook.proto,内容如下:

    

    package addressbook;
    
    message Person {
            required string name = 1;
            required int32 id = 2;
            optional string email = 3;
    
            enum PhoneType{
                    MOBILE = 0;
                    HOME = 1;
                    WORK = 2;
            }
    
            message PhoneNumber {
                    required string number = 1;
                    optional PhoneType type = 2 [default = HOME];
            }
    
            repeated PhoneNumber phone = 4;
    }
    
    
    message AddressBook {
            repeated Person person = 1;
    }

    

 编译addressbook.proto文件后生成addressbook_pb2.py:

protoc -I=/root/ --python_out=/root/ /root/addressbook.proto


2.写入addressbook.proto结构体中字段的值

  • SerializeToString(): 序列化这个message和以字符串的方式返回。 注意,这是二进行字节,不是一个文本; 我们只使用str类型作为一个方便的容器。

import addressbook_pb2
def PromptForAddress(person):
    person.id = 1
    person.name = "zhuobaobao"
    person.email = "zhuobaobao@gmail.com"
    phone_number = person.phone.add()
    phone_number.number = "1590000000"
    phone_number.type = addressbook_pb2.Person.HOME
address_book = addressbook_pb2.AddressBook()
PromptForAddress(address_book.person.add())
with open("test.txt","w") as f:
        f.write(address_book.SerializeToString())


3.读取test.txt文件中proto结构的数据

  • ParseFromString(data): 从给出的字符串中解析一条message。

import addressbook_pb2
def ListPeople(address_book):
    for person in address_book.person:
        print "person ID:",person.id
        print "name:",person.name
        if person.HasField("email"):
            print "email address:",person.email
            for phone_number in person.phone:
                if phone_number.type == addressbook_pb2.Person.HOME:
                    print "home phone:",
                elif phone_nummber.type == addressbook_pb2.Person.WORK:
                    print "work phonne:",
                print phone_number.number
address_book = addressbook_pb2.AddressBook()
with open("test.txt","r") as f:
        address_book.ParseFromString(f.read())
ListPeople(address_book)

blob.png