Assuming you're using the definitions in "tutorial.thrift":

Generate the Code

Make sure the thrift compiler is installed somewhere in your PATH. Then generate new style classes (inherit from object, better introspection) for the tutorial:

thrift -gen py:new_style tutorial.thrift
thrift -gen py:new_style shared.thrift

To generate old style classes:

thrift -gen py tutorial.thrift
thrift -gen py shared.thrift

This makes a gen-py/ subdirectory for the generated code.

Import the Classes

First make sure you have added the gen-py/ subdirectory to your sys.path with:

import sys
sys.path.append('gen-py')

Then import the classes:

import tutorial.Calculator
from tutorial.ttypes import *
from thrift.protocol import TBinaryProtocol
from thrift.transport import TTransport

Create Objects, Using Constants

Make a Work thrift object, and set its 'op' field to the ENUM Operation.ADD defined in tutorial.thrift and set two numeric fields to some values.

work = Work()
work.num1 = 7
work.num2 = 9
work.op = Operation.ADD

Serialize to/from a string

Create a TMemoryBuffer object to contain the serialized bytes, a TBinaryProtocol object to perform the serialization, and use the thrift Work object's write method to produce the serialized bytes.

Then, take the serialized bytes and pass them into a new TMemoryBuffer, pass that into another TBinaryProtocol, create a new/empty thrift Work object, and use it's read method to deserialize the bytes, setting all the fields.

transportOut = TTransport.TMemoryBuffer()
protocolOut = TBinaryProtocol.TBinaryProtocol(transportOut)
work.write(protocolOut)
bytes = transportOut.getvalue() # the string 'bytes' can be written out to disk 
                                #  to be read in at a different time

transportIn = TTransport.TMemoryBuffer(bytes)
protocolIn = TBinaryProtocol.TBinaryProtocol(transportIn)
moreWork = Work()
moreWork.read(protocolIn)
  • No labels