如何在mac環(huán)境中用python處理protobuf
這篇文章主要介紹了如何在mac環(huán)境中用python處理protobuf,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
安裝
brew install protobuf
然后再安裝protobuf需要的依賴
brew install autoconf automake libtool
驗(yàn)證是否安裝成功
protoc –version
protobuf3語(yǔ)法介紹
1.字段前取消了required和optional兩個(gè)關(guān)鍵字,目前可用的只有repeated關(guān)鍵字。
2.不可以現(xiàn)設(shè)置默認(rèn)值了。
a.string默認(rèn)為空串
b.枚舉默認(rèn)為第一個(gè)枚舉定義的第一個(gè)值。并且必須是0,必須有有一個(gè)0值,我們可以用這個(gè)0值作為默認(rèn)值。
這個(gè)零值必須為第一個(gè)元素,為了兼容proto2語(yǔ)義,枚舉類的第一個(gè)值總是默認(rèn)值。
c.bytes默認(rèn)為空bytes
d.bool默認(rèn)為false
e.數(shù)字類型默認(rèn)為0
3.protoType類型如下:
double、float、int32、int64、uint32、uint64、sint32、sint64、fixed32、fixed64、sfixed32、sfixed64、bool、string、bytes
4、分配標(biāo)識(shí)號(hào)
正如你所見,在消息定義中,每個(gè)字段都有唯一的一個(gè)數(shù)字標(biāo)識(shí)符。這些標(biāo)識(shí)符是用來在消息的二進(jìn)制格式中識(shí)別各個(gè)字段的,一旦開始使用就不能夠再改變。注:[1,15]之內(nèi)的標(biāo)識(shí)號(hào)在編碼的時(shí)候會(huì)占用一個(gè)字節(jié)。[16,2047]之內(nèi)的標(biāo)識(shí)號(hào)則占用2個(gè)字節(jié)。所以應(yīng)該為那些頻繁出現(xiàn)的消息元素保留 [1,15]之內(nèi)的標(biāo)識(shí)號(hào)。切記:要為將來有可能添加的、頻繁出現(xiàn)的標(biāo)識(shí)號(hào)預(yù)留一些標(biāo)識(shí)號(hào)。
最小的標(biāo)識(shí)號(hào)可以從1開始,最大到2^29 - 1, or 536,870,911。不可以使用其中的[19000-19999]( (從FieldDescriptor::kFirstReservedNumber 到 FieldDescriptor::kLastReservedNumber))的標(biāo)識(shí)號(hào), Protobuf協(xié)議實(shí)現(xiàn)中對(duì)這些進(jìn)行了預(yù)留。如果非要在.proto文件中使用這些預(yù)留標(biāo)識(shí)號(hào),編譯時(shí)就會(huì)報(bào)警。同樣你也不能使用早期保留的標(biāo)識(shí)號(hào)。
指定字段規(guī)則
所指定的消息字段修飾符必須是如下之一:
- singular:一個(gè)格式良好的消息應(yīng)該有0個(gè)或者1個(gè)這種字段(但是不能超過1個(gè))。
- repeated:在一個(gè)格式良好的消息中,這種字段可以重復(fù)任意多次(包括0次)。重復(fù)的值的順序會(huì)被保留。
在proto3中,repeated的標(biāo)量域默認(rèn)情況蝦使用packed。
編寫protoco文件,addressbook.proto。
syntax = "proto3"; //正在使用proto3語(yǔ)法,如果你沒有指定這個(gè),編譯器會(huì)使用proto2 package tutorial; //*.proto文件中數(shù)據(jù)類型可以分為兩大類: //復(fù)合數(shù)據(jù)類型包括:枚舉和message類型 //標(biāo)準(zhǔn)數(shù)據(jù)類型包含:整型,浮點(diǎn),字符串等 message AddressBook { //repeated: 該字段可以重復(fù)任意次數(shù),包括0次。重復(fù)數(shù)據(jù)的順序?qū)?huì)保存在protocol buffer中,將這個(gè)字段想象成一個(gè)可以自動(dòng)設(shè)置size的數(shù)組就可以了。 repeated Person people = 1; } message Person { //每個(gè)字段有一種類型 //該Number是用來標(biāo)記該字段在序列化后的二進(jìn)制數(shù)據(jù)中所在的field, //每個(gè)字段的Number在message內(nèi)部都是獨(dú)一無(wú)二的。也不能進(jìn)行改變,否則數(shù)據(jù)就不能正確的解包 string name = 1; int32 id = 2; string email = 3; float money =4; bool work_status = 5; repeated PhoneNumber phones =6; MyMessage maps =7; } message PhoneNumber{ string number =1; PhoneType type =2; } enum PhoneType{ MOBILE =0; HOME =1; WORK =2; } message MyMessage{ map<int32,int32> mapfield =1; }
編譯生成python代碼
protoc ./addressbook.proto --python_out=./
創(chuàng)建一個(gè)解析文件
protobufdemo.py
# -*- coding: utf-8 -*- # @Time : 2019-11-15 11:25 # @Author : cxa # @File : protobufdemo.py # @Software: PyCharm import addressbook_pb2 address_book = addressbook_pb2.AddressBook() person = address_book.people.add() person.id = 1 person.name = "cxa" person.email = "1@qq.com" person.money = 1234.00 person.work_status = True phone_number = person.phones.add() phone_number.number = "123456" phone_number.type = addressbook_pb2.MOBILE maps = person.maps maps.mapfield[1] = 1 maps.mapfield[2] = 2 # 序列化 serializeTostring = address_book.SerializeToString() # 生成字節(jié)數(shù)組 str_result = address_book.ParseFromString(serializeTostring) # 轉(zhuǎn)為字符串 print(str_result) for person in address_book.people: print(person) for phone_number in person.phones: print(phone_number) for key in person.maps.mapfield: print(key, person.maps.mapfield[key])
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python如何實(shí)現(xiàn)文本轉(zhuǎn)語(yǔ)音
文本轉(zhuǎn)語(yǔ)音,一般會(huì)用在無(wú)障礙開發(fā)。下面介紹如何使用Python實(shí)現(xiàn)將文本文件轉(zhuǎn)換成語(yǔ)音輸出。跟著小編一起來看看吧。2016-08-08python機(jī)器學(xué)習(xí)pytorch?張量基礎(chǔ)教程
這篇文章主要為大家介紹了python機(jī)器學(xué)習(xí)pytorch?張量基礎(chǔ)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10python實(shí)現(xiàn)簡(jiǎn)單銀行管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單銀行管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10matplotlib之pyplot模塊添加文本、注解(text和annotate)
matplotlib是python最著名的繪圖庫(kù),它提供了一整套和matlab相似的命令A(yù)PI,十分適合交互式地行制圖,下面這篇文章主要給大家介紹了關(guān)于matplotlib之pyplot模塊添加文本、注解(text和annotate)的相關(guān)資料,需要的朋友可以參考下2022-05-05flask路由分模塊管理及自定義restful響應(yīng)格式詳解
這篇文章主要為大家介紹了flask路由分模塊管理及自定義restful響應(yīng)格式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08pytorch DistributedDataParallel 多卡訓(xùn)練結(jié)果變差的解決方案
這篇文章主要介紹了pytorch DistributedDataParallel 多卡訓(xùn)練結(jié)果變差的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06python如何獲取網(wǎng)絡(luò)數(shù)據(jù)
這篇文章主要介紹了python如何獲取網(wǎng)絡(luò)數(shù)據(jù),幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-04-04Python裝飾器使用實(shí)例:驗(yàn)證參數(shù)合法性
這篇文章主要介紹了Python裝飾器使用實(shí)例:驗(yàn)證參數(shù)合法性,本文直接給出代碼實(shí)例,代碼中包含詳細(xì)注釋,需要的朋友可以參考下2015-06-06