Accéder aux données d’une structure renvoyée par la fonction C en Python à l’aide de ctypes

Je sais que le sujet a déjà été traité, mais je n’ai rien trouvé qui puisse fonctionner pour moi. Je suppose donc que mon problème est légèrement différent des autres.

Ce que je fais, en gros, c’est que j’utilise une fonction C encapsulée dans un code python à l’aide de ctypes. Mon objective est de calculer des quantités dans la fonction C, de les stocker dans une structure unique et de renvoyer la structure en Python où je pourrais lire toutes les données différentes de la structure.

Alors :

Pour définir ma structure en python, j’utilise:

class BITE(ctypes.Structure): _fields_ = [ ("lum", ctypes.c_int), ("suce", ctypes.c_int) ] 

Je comstack comme ça:

 sub.call(["gcc","-shared","-Wl,-install_name,ex.so","-o","ex.so","-fPIC","ex.c"]) lum = ctypes.CDLL('ex.so') lum = lum.lum 

Je déclare les arguments et les types de résultats comme ceci:

 lum.restype = ctypes.POINTER(BITE) lum.argtypes = [ctypes.POINTER(ctypes.c_float),ctypes.c_int,ctypes.POINTER(ctypes.c_float),ctypes.c_int,ctypes.POINTER(ctypes.c_float),ctypes.POINTER(ctypes.c_float),ctypes.c_int,ctypes.POINTER(ctypes.c_float),ctypes.c_int,ctypes.POINTER(ctypes.c_float),ctypes.POINTER(ctypes.c_float),ctypes.POINTER(ctypes.c_float),ctypes.POINTER(ctypes.c_float),ctypes.c_float,ctypes.c_float,ctypes.c_float,ctypes.c_float,ctypes.c_float] 

Ensuite, j’appelle la fonction C “lum” dans le code python

 out = lum(all the different variables needed) 

Le problème commence ici. J’ai ma structure, mais impossible de lire les données stockées dans chaque champ.

Une solution partielle que j’ai trouvée est de faire:

 out = out[0] 

Mais alors, en faisant

 print(out.suce) 

J’ai un problème de segmentation 11. Je ne sais pas pourquoi. J’ai essayé de comprendre comment utiliser create_ssortingng_buffer, mais je ne comprenais pas vraiment comment cela fonctionnait et ce qu’il était censé faire. De plus, j’ai essayé d’utiliser comme une boîte noire, et encore, rien ne fonctionne.

J’ai aussi essayé d’autres solutions mentionnées dans d’autres threads, telles que l’utilisation de out.contents ou quelque chose du genre, mais il n’a pas d’atsortingbut .contents. Nor out.suce.value, qui est aussi quelque chose que j’ai vu quelque part au cours de mes recherches désespérées.

Bien sûr, j’ai vérifié dans le code C que la structure existe et que chaque champ de la structure existe et contient les bonnes données.

Merci.

Supposons que vous ayez une structure en C comme celle-ci:

 typedef struct _servParams { unsigned short m_uServPort; char m_pInetAddr[MAX_LENGTH_OF_IP_ADDRESS]; } ServerParams_t; 

Pour l’utiliser dans les ctypes, vous devez créer un wrapper comme ceci:

 class ServerParams_t(Structure): _fields_ = [ ("m_uServPort", c_ushort), ("m_pInetAddr", (c_char * 16)) ] 

Plus tard, dans votre python, vous pouvez utiliser l’extrait suivant:

 servParams = ServerParams_t() servParams.m_uServPort = c_ushort(int(port)) servParams.m_pInetAddr = ip.encode() 

Si vous devez le transmettre par valeur, transmettez simplement la variable servParams à votre API. Si vous devez passer un pointeur, utilisez byref(servParams) .