I’m calling a C shared library from Python on a Linux system.
The problem I’m running into is the function inside the C library takes a pointer to a structure as an argument. It then mallocs the memory for an array of structures, populates the array with data and returns. So I’ve defined the function as
from ctypes import *
class myStruct(Structure):
_fields_ = [("id", c_uint), "name", c_char*256)]
library.func.argtypes = [POINTER(myStruct)]
Then I call it like so:
Myfoo = myStruct
Foo = pointer(Myfoo)
Bar = library.func(Foo)
for i in range(Bar):
print("id = %u, name = %s" % (Foo[i].id, Foo[i].name))
Bar contains the number of structures that were allocated by func.
No matter what I do, I can’t get any data out of Foo. I’ve tried multiple different variations on this for months. I can look at the logs from the C library and I know it’s getting the data and returning it, but I can’t seem to find a way to extract it from Python.
Any thoughts?
Ok, this just needs a few small updates, then.
First, your argument declaration is off, but that probably doesn’t matter. A pointer is a pointer, as far as the python-c value translation machinery is concerned. Most accurate would be
POINTER(POINTER(myStruct)), but to make things simpler, let’s just use:Next, you don’t need to bother creating a
myStructinstance for your argument to point at; you just need a valid pointer, and a pointer to that.funcwill allocate the actualmyStructinstances. So let’s start with:Now we can call it. We have a
myStruct*, but we’ll pass a pointer to it sofunccan change it. We don’t need to construct a whole other pointer object, so we’ll use the lighterbyref:Now you can iterate through
Foo[i].