How to return array from C++ function to Python using ctypes

arrays, c++, ctypes, python, return

Solution

`function.cpp` returns an int array, while `wrapper.py` tries to interpret them as doubles. Change `ArrayType` to `ctypes.c_int * 10` and it should work.

It's probably easier to just use `np.ctypeslib` instead of `frombuffer` yourself. This should look something like

import ctypes
from numpy.ctypeslib import ndpointer

lib = ctypes.CDLL('./library.so')
lib.function.restype = ndpointer(dtype=ctypes.c_int, shape=(10,))

res = lib.function()

Problem

I am using ctypes to implement a C++ function in Python. The C++ function should return a pointer to an array. Unfortunately I haven't figured out, how to access the array in Python. I tried numpy.frombuffer, but that was not successful. It just returned an array of arbitrary numbers. Obviously I didn't used it correctly. Here is a simple example with an array of size 10: Content of function.cpp: ``` extern "C" int* function(){ int* information = new int[10]; for(int k=0;k<10;k++){ information[k] = k; } return information; } ``` Content of wrapper.py: ``` import ctypes import numpy as np output = ctypes.CDLL('./library.so').function() ArrayType = ctypes.c_double*10 array_pointer = ctypes.cast(output, ctypes.POINTER(ArrayType)) print np.frombuffer(array_pointer.contents) ``` To compile the C++ file i am using: ``` g++ -c -fPIC function.cpp -o function.o g++ -shared -Wl,-soname,library.so -o library.so function.o ``` Do you have any suggestions what I have to do to access the array values in Python?

Original source

Related problems