4

ディレクトリ の下にあるため、Thriftがサポートしていると思われるpython 3.4を使用してApache Thriftを試しています。しかし、私はこのエラーメッセージを受け取り続けていますlib.linux-x86_64-3.4build

  File "/home/qunzi/Downloads/thrift-0.9.2/lib/py/build/lib.linux-x86_64-3.4/thrift/transport/TTransport.py", line 163, in write
self.__wbuf.write(buf)
TypeError: string argument expected, got 'bytes'

何が起こっているのか、そしておそらく解決策を知っている人はいますか?

以下は関連するコードです

socket = TSocket.TSocket('localhost', 9090)
transport = TTransport.TBufferedTransport(socket)
protocol = TBinaryProtocol.TBinaryProtocol(transport)

client = Algo.Client(protocol)
transport.open()
ping_req = PingRequest()
ping_resp = client.ping(ping_req)

トレースバック全体:

  File "py3client.py", line 36, in <module>
    ping_resp = client.ping(ping_req)
  File "/home/qunzi/Projects/test/sample_Test/py3.4_thrift/ib/Algo.py", line 66, in ping
    self.send_ping(request)
  File "/home/qunzi/Projects/test/sample_Test/py3.4_thrift/ib/Algo.py", line 70, in send_ping
    self._oprot.writeMessageBegin('ping', TMessageType.CALL, self._seqid)
  File "/home/qunzi/Downloads/thrift-0.9.2/lib/py/build/lib.linux-x86_64-3.4/thrift/protocol/TBinaryProtocol.py", line 46, in writeMessageBegin
    self.writeI32(TBinaryProtocol.VERSION_1 | type)
  File "/home/qunzi/Downloads/thrift-0.9.2/lib/py/build/lib.linux-x86_64-3.4/thrift/protocol/TBinaryProtocol.py", line 111, in writeI32
    self.trans.write(buff)
  File "/home/qunzi/Downloads/thrift-0.9.2/lib/py/build/lib.linux-x86_64-3.4/thrift/transport/TTransport.py", line 163, in write
    self.__wbuf.write(buf)
TypeError: string argument expected, got 'bytes'
4

1 に答える 1

2

Although the question is rather dead, it looks like I have an answer :)

The current python generator of thrift (as of 0.9.3) generates code, specific to python2. At least I've just switched the gears and the code which gave me the same error, now works like a charm.

The error is caused by (implicit) treating of all string-like objects within the library like byte objects. However, in Python3 StringIO class expects char-oriented strings (str) and those byte-oriented strings cause the exception.

One should file a bug to the Thrift tracker, and for now he/she should use Python2 instead.

于 2016-10-03T11:54:09.737 に答える