[Numpy-discussion] Pointer to array data for passing to swig-wrapped C++

Robert Kern robert.kern@gmail....
Mon Aug 24 14:47:47 CDT 2009

On Mon, Aug 24, 2009 at 12:37, Angus McMorland<amcmorl@gmail.com> wrote:
> Hi all,
> Our lab has an in-house messaging protocol, written in C++, for
> interfacing the different components of our experimental setups, and
> allowing programs written in several different languages to talk to
> each other. I'm currently trying to write a Python interface to this
> protocol, mainly so I can show people here how good a Traits-based GUI
> would be for controlling things. I'm not familiar with interfacing C++
> and Python code, so this is a little hit and miss, and any suggestions
> on better approaches would be welcome. I have wrapped the C++ code in
> swig, and can now call the simple routines from within Python.
> The trouble I'm having is constructing new message data, and passing a
> reference to that data. Each message consists of a ID code telling us
> what type of message it is, a buffer of data, of which some subset is
> actually useful, and the number of bytes of the buffer that have been
> filled with useful data. I can get message data out of a message
> constructed and sent by some other implementation of the protocol by
> reading it into a numpy array with a dtype matching the structure of
> the data being sent, and calling, for example:
> np.fromstring(msg_data[0:num_bytes], dtype=[('a', int),('b', float)])
> I can't work out how to do the reverse operation: to populate the C++
> message object with data constructed in Python. The message object has
> a SetData function,which is exposed by swig, that requires a 'void *'
> pointer to the data (as well as the number of bytes being sent), and I
> thought I might be able to do something like:
> msg.SetData(array.data, array.nbytes)
> where array is another ndarray of the desired dtype, but that returns the error:
> TypeError: in method 'CMessage_SetData', argument 2 of type 'void *'
> and using array.tostring() in place of array.data above gives exactly
> the same result. Is there a convenient syntax to pass a void * pointer
> to the array's data to the swig-wrapped SetData routine, or do I have
> to write some extra wrapping code to make this happen, and what might
> that code look like roughly?

You will need an extra typemap on SetData() to make it accept a char*
on the Python side (which can be supplied as a string or preferably a
buffer object) and cast it to a void*. Someone with more recent SWIG
experience or the SWIG docs will have to tell you how to do that,
though. It should be straightforward, though.

Robert Kern

"I have come to believe that the whole world is an enigma, a harmless
enigma that is made terrible by our own mad attempt to interpret it as
though it had an underlying truth."
  -- Umberto Eco

More information about the NumPy-Discussion mailing list