问题
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/hskj/anaconda3/lib/python3.5/site-packages/happybase/connection.py", line 242, in tables
names = self.client.getTableNames()
File "/hskj/anaconda3/lib/python3.5/site-packages/thriftpy/thrift.py", line 198, in _req
return self._recv(_api)
File "/hskj/anaconda3/lib/python3.5/site-packages/thriftpy/thrift.py", line 210, in _recv
fname, mtype, rseqid = self._iprot.read_message_begin()
File "thriftpy/protocol/cybin/cybin.pyx", line 439, in cybin.TCyBinaryProtocol.read_message_begin (thriftpy/protocol/cybin/cybin.c:6470)
cybin.ProtocolError: No protocol version header
回答1:
The problem seems related to the usage of the "strict read/write" flags. There is a non-standard "cybin" implementation of the standard Thrift binary protocol, the error is in this particular code block:
def read_message_begin(self):
cdef int32_t size, version, seqid
cdef TType ttype
size = read_i32(self.trans)
if size < 0:
version = size & VERSION_MASK
if version != VERSION_1:
raise ProtocolError('invalid version %d' % version)
name = c_read_val(self.trans, T_STRING)
ttype = <TType>(size & TYPE_MASK)
else:
if self.strict_read:
raise ProtocolError('No protocol version header') // <<<<<<
name = c_read_string(self.trans, size)
ttype = <TType>(read_i08(self.trans))
seqid = read_i32(self.trans)
return name, ttype, seqid
Without having tried, I'd guess that setting the "strict read" flag to false (instead of true) when instantiating the CyBin protocol should do the trick.
来源:https://stackoverflow.com/questions/43675423/python3-5-thrift-cybin-protocolerror-no-protocol-version-header