pythonc++python-bindings

Python Bindings with C++


I am interested in writing functions in C++ that can later be "imported" in Python. For example I wrote a simple function in C++ that adds two int numbers:

//function declaration
int addition(int a,int b);

//function definition
int addition(int a,int b)
{
    return (a+b);
}

I also have a header file which contains:

extern "C" MATHLIBRARY_API int addition(int a, int b);

Then in Python the code is straightforward due to the help of ctypes:

import ctypes

path = "C:\\my path to the .dll file"

# load the library
lib = ctypes.CDLL('{0}\MathLibrary.dll'.format(path))
answer = lib.addition(14, 2)
print(answer) // OUTPUT: 16

Everything works good so far, but I would like to do some math with more complex data structures such as vectors. I would like to have a vector of elements (example: {12, 10, 2, 14}) and add a number to all of the elements inside the vector. For example, n = 2, vector = {12, 10, 2, 14}, output = {14, 12, 4, 16}. I wrote a function that works in C++ but I can't manage to do the binding to Python. I believe that is due to the fact I am working with vectors and that extern "C" in the header file.


Solution

  • ctypes only allows you to interact with a library using C types, not C++. boost.python, pybind11, etc allow you pass C++ objects.

    However, there is a way to do what you want to do in ctypes using C-style arrays.

    Declare a function like this:

    extern "C" MATHLIBRARY_API void addToArray(int *array, int num, int size);
    

    and define it like this:

    void addToArray(int *array, int num, int size)
    {
        for (int i=0; i < size; ++i)
        {
            array[i] = array[i] + num;
        }
    }
    

    Then in your Python script do this:

    nums = [12, 10, 2, 14]
    array_type = ctypes.c_int * len(nums)
    lib.additionArray.argtypes = [ctypes.POINTER(ctypes.c_int), ctypes.c_int, ctypes.c_int]
    array = array_type(*nums)
    lib.addToArray(array, ctypes.c_int(2), ctypes.c_int(len(nums)))
    # copy modified array into original list
    nums[:] = list(array)
    print(nums)