Your python code will work after some minor modifications:
import ctypes
f = ctypes.CDLL('./library.so').function
f.restype = ctypes.POINTER(ctypes.c_int * 10)
print [i for i in f().contents] # output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Basically there are two changes:
-
remove numpy-related code and
ctypes.cast
call since we don’t need them. -
specify the return type to
ctypes.POINTER(ctypes.c_int * 10)
.By default foreign functions are assumed to return the C int type, hence we need change it to the desired pointer type.
BTW, returning a new
ed array from C code to Python code seems inappropriate. Who and when will free the memory? It’s better to create arrays in Python code and pass them to C code. This way it’s clear that the Python code owns the arrays and takes the responsibility of creating and reclaiming their spaces.