2011-06-20 24 views
13

Python ctypes modülünü kullanarak bazı time_t alanlarını içeren bir C yapısına erişiyorum.Ctypes kullanarak "time_t" tür/boyutunu alma

Tamamen taşınabilir olmayan yapısı nedeniyle, bu alanları statik olarak c_int veya c_long türünden tanımlayamıyorum.

Kodumu taşınabilir hale getirmek için bunları nasıl tanımlayabilirim?

Örnek C yapı tanımı:

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

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

İlgili piton ctypes yapısı:

En uygun seçenek komut çalışır sistemini introspecting ve ayrılmaz hangi tip bir iyi bahis yaparak olduğunu
from ctypes import * 

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

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

CFFI için benzer bir soru: http://stackoverflow.com/questions/19352932/declare-struct-containing-time-t-field-in-python-cffi –

cevap

2

kullanın. Bir şey gibi

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

alt çizgi time_t standardında tanımlı değil olmasıdır. İşletim sistemi ve derleyiciye kalmış. Bu nedenle Python betiğinizdeki time_t tanımınız DLL'e bağlıdır, böylece etkileşime geçersiniz.

+0

Temel olarak, aynı ikili içine yüklenen iki paylaşılan kitaplık Farklı (fakat uyumlu) derleyicilerle derlenmişlerse, bir time_t türü için farklı boyutlara sahip olabilirler. – GaretJax

+0

"time_t" uzunluğunun, onu kullanan kitaplık ikili olarak derlendikten sonra belirlenirdi. Müşterinin kaynağını uyumlu hale getirmek için, ikincisini derlerken aynı ayarları kullanmanız gerekir. – Santa

+0

Klişeler ile birlikte bir pyrex modülü kullandığım halde, beneof (time_t) sonucunu tutan bir sabiti tanımladım. Kullanılan derlenmiş paylaşılan lib'ler arasında doğru boyutu garanti edemem ancak en azından şu an kullandığım derleyici ayarları için (kütüphanelerin aynı ayarlarla derlenmiş olmasını umarak). – GaretJax

İlgili konular