修改Python3.x的Thrift0.9.3庫解決兼容問題

? ? Thrift官方提供的python庫,對(duì)Python2.7支持很好,雖然Python3.x以上也可以安裝,而且程序編寫也沒什么問題,但一旦和其他語言的服務(wù)端或者客戶端聯(lián)調(diào)時(shí),就會(huì)出現(xiàn)各種各樣莫名其妙的異常錯(cuò)誤(同樣代碼,Python2.7沒有問題),導(dǎo)致工作沒法進(jìn)行下去,耽誤了不少時(shí)間。

? ? 在網(wǎng)上查了不少資料,發(fā)現(xiàn)相關(guān)信息很少,通過整理總結(jié),這些問題主要還是Python3.x相對(duì)Python2.7沒有做到語法兼容造成的,想解決,必須修改Thrift庫的源碼!

? ? 問題主要集中在兩塊:

? ? 1. Python3.x對(duì)Unicode的支持和新增的byte字節(jié)類

? ? 2. Python3.x取消UnboundMethodType類型

? ? 針對(duì)以上兩類問題,需要修改三處代碼:

? ? 1. transport/TTransport.py文件

? ? Line 20:

from io import StringIO

? ?改成

from io import BytesIO as StringIO

? ?Line 56:

buff =''

? ? 改成

buff =b''

? ? Line 143:

self.__rbuf = StringIO("")

? ? 改成

self.__rbuf = StringIO(b"")

? ? 2. protocol/TBinaryProtocol.py

? ? Line 122-123:

self.writeI32(len(str))

self.trans.write(str)

? ? 改成

buff = bytes(str,'utf-8')

self.writeI32(len(buff))

self.trans.write(buff)

? ? Line 223:

str = self.trans.readAll(len)

? ? 改成

len = self.readI32()

str = self.trans.readAll(len).decode('utf-8')

? ? 3. protocol\TProtocolDecorator.py

Line 31:

if type(member) in [MethodType, UnboundMethod, TypeFunctionType, LambdaType, BuiltinFunctionType, BuiltinMethodType]:

改成(去掉UnboundMethod類型,該類型等同MethodType,且在Python3.x中已經(jīng)廢除)

if type(member) in [MethodType, TypeFunctionType, LambdaType, BuiltinFunctionType, BuiltinMethodType]:

? ? 我對(duì)thrift應(yīng)用和了解還不太深,但經(jīng)過以上3個(gè)文件的改動(dòng),目前我自己程序中涉及到的thrift的功能在Thrift3.x下都可以正常使用了。

? ? 寫下此文給遇到類似困難的朋友一點(diǎn)幫助。以上改動(dòng)基于Python3.5下最新的thrift 0.9.3庫改寫,如其他版本有問題,歡迎留言討論。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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