Salut à tous !
J'essaie de faire une bibliothèque en C et d'y accéder depuis Python. J'ai choisi d'utiliser ctypes.
Le problème, c'est que je souhaite retourner un Array, mais je n'y arrive pas. Voici mon code :
que je compile avec :
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 /* Fichier: bidule.c */ #include <stdio.h> /*---------------------------------------------------------------------------*/ long *toto(int n) { int i; long img[n*n]; for (i=0; i<n*n; i++) { img[i] = i; }; return img; /*&img[0][0];*/ } /*---------------------------------------------------------------------------*/ int tata(int n) { int i; long *t = toto(n); for (i=0; i<n*n; i++) { printf("%ld ", t[i]); }; printf("\n-----\n"); return n; } /*---------------------------------------------------------------------------*/
Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 gcc -shared -Wl,-soname,bidule.so.1 -o bidule.so bidule.o gcc -Wall -fPIC -c bidule.c
Mon code python est le suivant :Le résultat est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 from ctypes import cdll, c_int, c_long, c_double mylib = cdll.LoadLibrary("bidule.so") dim = 3 mylib.tata.argtypes = [c_int] x = mylib.tata(dim) mylib.toto.argtypes = [c_int] mylib.toto.restype = c_long * (dim**2) x = mylib.toto(dim) print type(x) print [_ for _ in x]La 1ère ligne est renvoyée par la fonction "tata" et la dernière par python. Normalement, ça aurait du être [0,1,2,3,4,5,6,7,8]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 0 1 2 3 4 5 6 7 8 ----- <class '__main__.c_long_Array_9'> [-1075527424, 148238472, 0, -1208711504, 8191, 0, 148518376, -1208037388, -1207760664]
Il se peut que le problème vienne du code C, car malgré le fait que "tata" retourne bien "0 1 2 3 4 5 6 7 8", j'ai cette erreur à la compilation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 gcc -Wall -fPIC -c bidule.c bidule.c: In function toto: bidule.c:16: attention : cette fonction retourne l'adresse d'une variable locale gcc -shared -Wl,-soname,bidule.so.1 -o bidule.so bidule.o
Merci d'avance à tous ceux qui essaieront de comprendre
PS : je suis sous Linux, gcc-4.3.2, python-2.5.4
-
Partager