2011-06-20 9 views
13

Sto accedendo a una struttura C che contiene alcuni campi time_t utilizzando il modulo python ctypes.Ottenere tipo/dimensione di `time_t` usando i tipi di carattere

Data la sua natura non completamente portatile, non posso definire staticamente questi campi a partire dal tipo c_int o c_long.

Come posso definirli per rendere portatile il mio codice?

Esempio C definizione struct:

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

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

rispettiva struttura ctypes pitone:

from ctypes import * 

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

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

domanda simile per CFFI: http://stackoverflow.com/questions/19352932/declare-struct-containing-time-t-field-in-python-cffi –

risposta

2

La cosa migliore è di introspezione del sistema lo script viene eseguito su e fare una scommessa migliore su quale tipo integrante uso. Qualcosa di simile,

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

La linea di fondo è che time_t non è definito nello standard. Dipende dal sistema operativo e dal compilatore. Quindi la tua definizione di time_t nel tuo script Python dipende dalla DLL/con cui stai interagendo.

+0

Quindi, fondamentalmente, due librerie condivise caricato nella stessa binario potrebbe avere dimensioni diverse per un tipo time_t se sono compilati con compilatori diversi (ma compatibili)? – GaretJax

+0

La lunghezza di 'time_t' sarebbe stata determinata una volta che la libreria che lo utilizza è stata compilata in binario. Per rendere compatibile la sorgente del client, è sufficiente utilizzare le stesse impostazioni quando si compila quest'ultimo. – Santa

+0

Non è abbastanza, sebbene mentre sto usando un modulo pyrex in combinazione con i ctype, ho definito una costante tenendo il risultato di sizeof (time_t). Non posso garantire la dimensione corretta tra le librerie condivise compilate usate, ma almeno per le impostazioni del compilatore che attualmente utilizzo (sperando che le librerie fossero compilate con le stesse impostazioni). – GaretJax

Problemi correlati