2012-03-08 10 views
8

He declarado estáticamente una estructura grande en C, pero necesito usar estos mismos datos para hacer algunos análisis en Python. Prefiero no volver a copiar estos datos en Python para evitar errores, ¿hay alguna forma de acceder (solo leer) esta información directamente en Python? He mirado "ctypes" y TRAGO, y ninguno de ellos parece proporcionar lo que estoy buscando ....Acceso C-Declarado Anidado Struct desde Python

Por ejemplo tengo:

/* .h archivo */

typedef struct 
{ 
    double data[10]; 
} NestedStruct; 


typedef struct 
{ 
    NestedStruct array[10]; 
} MyStruct; 

/* .c archivo */

MyStruct the_data_i_want = 
{ 
    {0}, 
    { 
    {1,2,3,4} 
    }, 
    {0}, 
}; 

Idealmente, me gustaría algo que me permitiera llegar esto en python y acceda a través de the_data_i_want.array[1].data[2] o algo similar. ¿Alguna idea? Me dieron un trago para "trabajar" en el sentido de que pude compilar/importar un .so creado a partir de mi archivo .c, pero no pude acceder a ninguno a través de cvars. Tal vez hay otra manera? Parece que esto no debería ser tan difícil ....


En realidad, lo descubrí. Estoy agregando esto porque mi reputación no me permite responder mi propia pregunta en 8 horas, y como no quiero tener que recordarla en 8 horas, la agregaré ahora. Estoy seguro de que hay una buena razón para esto que no entiendo.

Lo descubrí.

primera compilé mi archivo .c en una biblioteca:

Entonces, solía tipos para definir una clase Python que contendría los datos:

from ctypes import * 

class NestedStruct(Structure): 
    _fields_ = [("data", c_double*10)] 

class MyStruct(Structure): 
    _fields_ = [("array", NestedStruct*10)] 

Entonces, he cargado en la biblioteca compartida Python:

my_lib = cdll.LoadLibrary("my_lib.so") 

Entonces, he utilizado el método "in_dll" para obtener los datos:

the_data_i_want = MyStruct.in_dll(my_lib, "the_data_i_want") 

Entonces, pude acceder a él como si fuera C. the_data_i_want.array[1].data[2]

Nota pude haber ensuciado la sintaxis ligeramente aquí porque mi estructura de datos real se anida 3 niveles y quería simplificar para fines de ilustración aquí.

+0

Para SWIG podría estar interesado en http://stackoverflow.com/q/8114030/168175 – Flexo

+2

Quizás este sea un buen momento para migrar la solución a una respuesta real y aceptarla. – augurar

Respuesta

1

También podría leer en C los datos y escribirlos en un archivo JSON, que luego podría analizar fácilmente (generalmente hay una biblioteca que incluso lo hará por usted; python import json) y acceder desde cualquier plataforma diferente con casi cualquier configuración de idioma que se te ocurra. Y al mismo tiempo, podría haber accedido a sus datos de forma muy similar en comparación con la forma en que accedió dentro de su código C original.

Solo como sugerencia. Creo que esto haría que sus datos sean más portátiles y versátiles, pero pasará más tiempo escribiendo y analizando el JSON como si acabara de leer la secuencia de datos directamente desde su código C en python.