? ? Thrift官方提供的python庫,對Python2.7支持很好,雖然Python3.x以上也可以安裝,而且程序編寫也沒什么問題,但一旦和其他語言的服務(wù)端或者客戶端聯(lián)調(diào)時,就會出現(xiàn)各種各樣莫名其妙的異常錯誤(同樣代碼,Python2.7沒有問題),導(dǎo)致工作沒法進行下去,耽誤了不少時間。
? ? 在網(wǎng)上查了不少資料,發(fā)現(xiàn)相關(guān)信息很少,通過整理總結(jié),這些問題主要還是Python3.x相對Python2.7沒有做到語法兼容造成的,想解決,必須修改Thrift庫的源碼!
? ? 問題主要集中在兩塊:
? ? 1. Python3.x對Unicode的支持和新增的byte字節(jié)類
? ? 2. Python3.x取消UnboundMethodType類型
? ? 針對以上兩類問題,需要修改三處代碼:
? ? 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]:
? ? 我對thrift應(yīng)用和了解還不太深,但經(jīng)過以上3個文件的改動,目前我自己程序中涉及到的thrift的功能在Thrift3.x下都可以正常使用了。
? ? 寫下此文給遇到類似困難的朋友一點幫助。以上改動基于Python3.5下最新的thrift 0.9.3庫改寫,如其他版本有問題,歡迎留言討論。