10 votes

ctypes.ArgumentError : Ne sait pas comment convertir le paramètre

Je définis une fonction dans la bibliothèque C comme suit :

int* Test(char *str1,int id1,char *str2,float val,float *ls)

Je veux l'utiliser en python et j'écris donc le code python suivant :

str1 = 'a'
str2 = 'b'
id1 = 0
val = 1.0
system('g++ -c -fPIC libtraj.cpp -o test.o')
system('g++ -shared -Wl,-soname,test.so -o test.so test.o')
lib = cdll.LoadLibrary('./test.so')
num_item = 100000
ls = (ctypes.c_float * num_item)()
lib.Test.restype = ndpointer(dtype=ctypes.c_int, shape=(num_item,))
lib.Test.argtypes = [c_char_p]
a = create_string_buffer(str1)
b = create_string_buffer(str2)
ls_id = lib.Test(a,id1,b,val,ctypes.byref(ls))

Je lance ensuite ce programme python. Je rencontre l'erreur suivante :

ls_id = lib.Test(a,id1,b,val,ctypes.byref(ls))
ctypes.ArgumentError: argument 4: <type 'exceptions.TypeError'>: Don't know how to convert parameter 4

Qu'est-ce qui ne va pas avec mon code ? Merci à tous de m'aider !!!

9voto

pfc Points 714

La solution proposée par @CristiFati résout mon problème. Je me contente de copier sa réponse dans les commentaires et de la présenter ici. Merci @CristiFati.

Essayez :

lib.Test.argtypes = [c_char_p, c_int, c_char_p, c_float, POINTER(c_float)] # (all defined by ctypes)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X