python解析protobuf文件

proto_parser

a python compiler for protobuf

github: https://github.com/LiuRoy/proto_parser

安裝使用

下載代碼進(jìn)入目錄之后執(zhí)行:

pyton setup.py install

當(dāng)前支持直接讀取proto文件構(gòu)造客戶端,使用方法參考example/client.py

import grpc
from protoparser import make_client

client = make_client('./helloworld.proto')

channel = grpc.insecure_channel('localhost:50051')
stub = client.GreeterStub(channel)
response = stub.SayHello(client.HelloRequest(name='abc'))
print("Greeter client received: " + response.name)

代碼講解

本人接觸到的rpc通信協(xié)議有thrift和protobuf竞惋,兩者很類似。雖然原生的thrift和protobuf編譯器針對不同語言都只能將接口文件轉(zhuǎn)換為可以使用的中間文件漩勤,但不同于其他靜態(tài)語言膘融,python的動(dòng)態(tài)類型可以很方便的將接口文件直接加載使用粘室,例如thrift的python第三方庫thriftpy问词,使用起來比原生庫要方便很多瓤逼。但個(gè)人覺得thriftpy自己造輪子的成分過多踢关,client伞鲫、servier以及底層的通信實(shí)現(xiàn)全部重寫了一套,不是很確定能否和原生框架無縫對接签舞。參考thriftpy秕脓,自己也實(shí)現(xiàn)了一個(gè)簡單的protobuf編譯器,解析生成的結(jié)果也盡量用原生對象儒搭。

左邊是官方提供的protobuf使用流程吠架,具體參考鏈接http://www.grpc.io/docs/quickstart/python.html,可以看出每次修改完protobuf文件都需要用protobuf compiler重新生成中間文件搂鲫,使用上不是很友好傍药,期望的目標(biāo)是右邊那樣,只需要重啟一下進(jìn)程就可以了魂仍。

使用流程

詞法分析

詳見文件lexer.py拐辽,直接使用第三方庫ply做的詞法解析。詞法分析算法上很復(fù)雜擦酌,但是使用起來卻很直觀俱诸,就是將輸入文本按照自定義的規(guī)則解析為一個(gè)一個(gè)的符號(hào)。詳細(xì)內(nèi)容可以參考lex文檔赊舶。

語法分析

詳見文件grammar.py睁搭,也是直接使用的第三方庫ply做的語法分析,具體的文法參考的thriftpy笼平,thriftpy的語法解析用到了很多全局變量园骆,雖然實(shí)現(xiàn)簡單而且好理解,最大的缺陷就是不是線程安全寓调,不能支持多線程锌唾,所以具體的實(shí)現(xiàn)上做了一些調(diào)整。調(diào)整內(nèi)容有一下:

  • 語法上為proto3的子集夺英,protoparser解析沒有問題的接口文件原生編譯器一定能解析鸠珠,反之不一定
  • enum packed singular import reserved option oneof等關(guān)鍵詞不支持,因?yàn)橛貌簧锨雉铮砸簿蛻械脤?shí)現(xiàn)
  • 不支持在message仲嵌套定義message渐排,但是可以使用已經(jīng)定義的message類型
  • 因?yàn)槭窃谧詈笞龅姆?hào)檢查,支持用到的符號(hào)在后面定義

沒有編譯基礎(chǔ)的童鞋閱讀ply的yacc文檔可能比較迷茫灸蟆,建議看一下編譯原理仲關(guān)于語法分析相關(guān)的概念和算法驯耻,在此推薦胡倫均的編譯原理,每一個(gè)概念都會(huì)給很多例子解釋炒考,很適合入門學(xué)習(xí)可缚。至于輪子哥推薦的parsing techniques以及龍虎鯨書,可以作為進(jìn)階學(xué)習(xí)使用斋枢。

ply的語法分析使用了LRLR算法帘靡,這是一種至下而上的分析法,也就是從給定的輸入串開始瓤帚,根據(jù)文法規(guī)則逐步進(jìn)行歸約描姚,直至歸約到文法開始的符號(hào)涩赢,或者說從語法樹的末端開始,步步向上歸約轩勘,直至根節(jié)點(diǎn)的分析方法筒扒。自定義的函數(shù)也是在對應(yīng)的文法歸約的時(shí)候執(zhí)行,理解了這一點(diǎn)對使用ply很重要绊寻,定義好文法之后花墩,按照文法一步一步實(shí)現(xiàn)歸約函數(shù),寫語法解析也是一件很有意思的事情澄步。

類型轉(zhuǎn)換

詳見objects.py和parser.py冰蘑,自己實(shí)現(xiàn)的語法解析直接解析為原生的對象,而是按照自己的文法邏輯先解析成objects.py仲定義的類型村缸,然后在parser.py仲做了一些轉(zhuǎn)換祠肥,由于沒有相關(guān)的文檔,實(shí)在是不清楚原生對象的使用方法王凑,所以盲人摸象般的寫了最簡單類型的轉(zhuǎn)關(guān)規(guī)則搪柑。本來以為python動(dòng)態(tài)類型用起來很美好,但是真的大量使用的時(shí)候索烹,不僅不好調(diào)試工碾,而且連自己也看不懂寫了啥玩意兒。歡迎有興趣的同伴提修改建議百姓。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末渊额,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子垒拢,更是在濱河造成了極大的恐慌旬迹,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件求类,死亡現(xiàn)場離奇詭異奔垦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)尸疆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門椿猎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寿弱,你說我怎么就攤上這事犯眠。” “怎么了症革?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵筐咧,是天一觀的道長。 經(jīng)常有香客問我,道長量蕊,這世上最難降的妖魔是什么铺罢? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮危融,結(jié)果婚禮上畏铆,老公的妹妹穿的比我還像新娘雷袋。我一直安慰自己吉殃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布楷怒。 她就那樣靜靜地躺著蛋勺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸠删。 梳的紋絲不亂的頭發(fā)上抱完,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音刃泡,去河邊找鬼巧娱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛烘贴,可吹牛的內(nèi)容都是我干的禁添。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼桨踪,長吁一口氣:“原來是場噩夢啊……” “哼老翘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起锻离,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤铺峭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后汽纠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卫键,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年虱朵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了莉炉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡卧秘,死狀恐怖呢袱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情翅敌,我是刑警寧澤羞福,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蚯涮,受9級(jí)特大地震影響治专,放射性物質(zhì)發(fā)生泄漏卖陵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一张峰、第九天 我趴在偏房一處隱蔽的房頂上張望泪蔫。 院中可真熱鬧,春花似錦喘批、人聲如沸撩荣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽餐曹。三九已至,卻和暖如春敌厘,著一層夾襖步出監(jiān)牢的瞬間台猴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工俱两, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饱狂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓宪彩,卻偏偏與公主長得像休讳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子毯焕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫衍腥、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評(píng)論 4 62
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議纳猫。它實(shí)...
    香橙柚子閱讀 23,862評(píng)論 8 183
  • 經(jīng)歷漫長的連續(xù)八天早起工作后 終于迎來了工作后的第一個(gè)新年假期婆咸。 也讓人可以有時(shí)間好好反省這半年多 工作半年 很多...
    L1Shan閱讀 222評(píng)論 0 0
  • 這是一篇開放式的文章,我想到哪兒寫到哪兒芜辕,請忽略邏輯尚骄。 文中所呈現(xiàn)的案例都是真實(shí)事件,分析內(nèi)容皆為原創(chuàng)侵续,僅代表個(gè)人...
    面團(tuán)妮妮閱讀 5,195評(píng)論 0 4
  • 1夜色將至 傍晚倔丈,夕照漸隱∽次希昏暗的套房里需五,秋澤從浴室中走出來,他只在腰間圍了條浴巾轧坎,頭上未干的水珠落在地毯上宏邮,留下...
    服部美伢閱讀 505評(píng)論 1 4