2011-06-20 21 views
13

Estoy accediendo a una estructura C que contiene algunos campos time_t usando el módulo python ctypes.Obteniendo el tipo/tamaño de `time_t` usando ctypes

Dada su naturaleza no completamente portátil, no puedo definir estos campos estáticamente a partir de c_int o c_long tipo.

¿Cómo puedo definirlos para que mi código sea portátil?

Ejemplo C definición struct:

#import <sys/types.h> 
#import <time.h> 

typedef struct my_struct { 
    time_t timestap; 
    uint16_t code;  
}; 

respectiva estructura de ctypes pitón:

from ctypes import * 

c_time = ? # What do I have to put here? 

class MyStruct(Structure): 
    _fields_ = [ 
     ('timestamp', c_time), 
     ('code', c_int16), 
    ] 
+0

Pregunta similar para CFFI: http://stackoverflow.com/questions/19352932/declare-struct-containing-time-t-field-in-python-cffi –

Respuesta

2

Su mejor apuesta es analizando el sistema de la secuencia de comandos se ejecuta en y hacer una mejor apuesta en la que tipo integral a utilizar. Algo así como,

if sys.platform == 'win32': 
    time_t = ctypes.c_uint64 
# ... 

La conclusión es que time_t no está definido en la norma. Depende del sistema operativo y el compilador. Entonces, su definición de time_t en su script de Python depende de la DLL/con la que está interactuando.

+0

Por lo tanto, básicamente, dos bibliotecas compartidas se cargan en el mismo binario podría tener diferentes tamaños para un tipo time_t si se compilaron con compiladores diferentes (pero compatibles)? – GaretJax

+0

La longitud de 'time_t' se habría determinado una vez que la biblioteca que la utiliza se haya compilado en formato binario. Para que la fuente del cliente sea compatible, solo tiene que usar la misma configuración al compilar esta última. – Santa

+0

No es suficiente, aunque como estoy usando un módulo pyrex en combinación con ctypes, definí una constante que contenía el resultado de sizeof (time_t). No puedo garantizar el tamaño correcto entre las librerías compiladas compiladas, pero al menos para las configuraciones del compilador que uso actualmente (con la esperanza de que las bibliotecas se hayan compilado con la misma configuración). – GaretJax