基於python的protobuf簡介及入門

Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內部的混合語言數據標準,Protocol Buffers 是一種輕便高效的結構化數據存儲格式,可以用於結構化數據串行化,或者說序列化。它很適合做數據存儲或 RPC 數據交換格式。可用於通訊協議、數據存儲等領域的語言無關、平臺無關、可擴展的序列化結構數據格式。

1、安裝protobuf
安裝以及在python下使用protobuf,要求python版本必須>2.6。

a) Windows

打開網頁下載最新版的protobuf-python-3.5.1.zipprotoc-3.5.1-win32.zip

解壓文件後,將protoc-3.5.1-win32\bin\protoc.exe 複製到protobuf-3.5.1\src,然後進入目錄protobuf-3.5.1\python\,運行命令:

  • python setup.py build //生成大量*.py

  • python setup.py install

b) Linux
打開網頁下載最新版的protobuf-python-3.5.1.tar.gz,然後在當前目錄下執行下述代碼:
# 安裝protobuf
tar zxvf protobuf-python-3.5.1.tar.gz
cd protobuf-3.5.1
./configure
make
make check
make install

# 驗證
protoc --version
out:libprotoc 3.5.1 #表示安裝成功

# 安裝python protobuf模塊
cd python
python setup.py install # 這一步需要先安裝six模塊才能正常安裝

2、測試

創建一個proto文件test.proto,這實際上是定義數據類型,類似c中的struct

message CDevice
{
   optional int32 devId = 1;
   optional string name = 2;
}

該數據類型名爲CDevice,其中包含兩個屬性,一個是int32型的設備Id devId,一個是string型的設備名稱 name運行命令,生成test_pb2.py,該py文件需要import到測試程序中。如果proto文件中沒有指定生成prot2還是proto3,默認生成proto2。在cmd中輸入:

  • 【安裝protec.exe的路徑】-I=【proto文件所在的文件夾!注意是文件夾路徑】 --python_out=【你期待輸出的文件路徑】【proto文件所在的文件夾+文件名】.proto

  • protoc -I=./ --python_out=./ test.proto

  • 注意等號兩邊不要留空格

-I爲proto文件的路徑,--python_out=./表示在當前路徑下由指定的.proto生成python可用的*.py文件

import test_pb2
import traceback
import sys
#注:在該py文件中可以查到protobuf的調用方法,主要有序列化和反序列化。中間省略了數據傳輸部分,數據序列化後可以用rpc、socket或者其他方式傳輸。

try:
    sendData = test_pb2.CDevice()
    sendData.devId = 9
    sendData.name = 'USB'

    sendDataStr = sendData.SerializeToString()
    print('SerializeToString:',sendDataStr)

    receiveDataStr = sendDataStr
    receiveData = test_pb2.CDevice()
    receiveData.ParseFromString(receiveDataStr)
    print('pares serialize string, return: devId = ', receiveData.devId, ', name = ',receiveData.name )
except Exception, e:
    print Exception, ':', e
    print traceback.print_exc()
    errInfo = sys.exc_info()
    print errInfo[0], ':', errInfo[1]

    
#輸出結果:
('SerializeToString:', '\x08\t\x12\x03USB')
('pares serialize string, return: devId = ', 9, ', name = ', u'USB')


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章