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?
If I got the 'func' prototype right from your comment in the question, then this should do:
#include <stdlib.h>
#include <stdio.h>
struct Foo
{
unsigned int id;
char name[256];
};
__declspec(dllexport) int func(struct Foo **ppFoo)
{
int i;
struct Foo *foo = malloc(5 * sizeof(struct Foo));
for(i=0;i<5;i++)
{
foo[i].id = i;
sprintf_s(foo[i].name,_countof(foo[i].name),"Name#%d",i);
}
*ppFoo = foo;
return 5;
}
from ctypes import *
dll = CDLL('x')
class Foo(Structure):
_fields_ = [
('id',c_uint),
('name',c_char*256)]
pfoo = POINTER(Foo)()
count = dll.func(byref(pfoo))
for i in xrange(count):
print pfoo[i].id,pfoo[i].name
0 Name#0
1 Name#1
2 Name#2
3 Name#3
4 Name#4
Note you will still need to free
the allocated memory somehow...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With