Calling C function from python using ctypes
Asked Answered
O

2

6

I have the following C code. I am trying to call this function from Python using ctypes:

int add ( int arr []) 
{
    printf("number %d \n",arr[0]);
    arr[0]=1;
    return arr[0];
}

I compiled this by using:

gcc -fpic -c test.c 
gcc -shared -o test.so test.o

then put it in /usr/local/lib.

Python call for this was:

from ctypes import *

lib = 'test.so'
dll = cdll.LoadLibrary(lib)
IntArray5 = c_int * 5
ia = IntArray5(5, 1, 7, 33, 99)
res = dll.add(ia)
print res

but I always get some big number like -1365200.

I tried also:

dll.add.argtypes=POINTER(c_type_int)

but it does not work.

Ose answered 20/8, 2014 at 14:23 Comment(0)
H
2

Try to build around that:

lib = 'test.so'
dll = cdll.LoadLibrary(lib)

dll.add.argtypes=[POINTER(c_int)]
#                ^^^^^^^^^^^^^^^^
#         One argument of type `int *̀

dll.add.restype=c_int
# return type 

res =dll.add((c_int*5)(5,1,7,33,99))
#            ^^^^^^^^^
#       cast to an array of 5 int

print res

Tested both with Python 2.7.3 and 2.6.9

Hydropic answered 20/8, 2014 at 14:42 Comment(0)
D
5

Instead, try:

dll = cdll.LoadLibrary('test.so')
res = dll.add(pointer(c_int(5)))
print res
Declamatory answered 20/8, 2014 at 14:30 Comment(0)
H
2

Try to build around that:

lib = 'test.so'
dll = cdll.LoadLibrary(lib)

dll.add.argtypes=[POINTER(c_int)]
#                ^^^^^^^^^^^^^^^^
#         One argument of type `int *̀

dll.add.restype=c_int
# return type 

res =dll.add((c_int*5)(5,1,7,33,99))
#            ^^^^^^^^^
#       cast to an array of 5 int

print res

Tested both with Python 2.7.3 and 2.6.9

Hydropic answered 20/8, 2014 at 14:42 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.