2011-06-20 32 views
13

私は、time_tフィールドを含むC構造体にPython ctypesモジュールを使ってアクセスしています。ctypesを使用して `time_t`の型/サイズを取得する

完全に移植性がないので、これらのフィールドは、c_intまたはc_longタイプとして静的に定義することはできません。

自分のコードを移植可能にするにはどうすれば定義できますか?

例Cの構造体の定義:

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

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

それぞれのPythonのctypesの構造:

from ctypes import * 

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

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

CFFIと同様の質問:http://stackoverflow.com/questions/19352932/declare-struct-containing-time-t-field-in-python-cffi –

答えて

2

あなたの最善の策は、あなたのスクリプトが上で動作するシステムをイントロスペクトし、整数型がへの最善の策を行うことですつかいます。何かのように、

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

一番下の行はtime_tが標準で定義されていないということです。それはOSとコンパイラによって異なります。したがって、あなたのPythonスクリプトでのtime_tの定義は、DLLに依存しているため、対話しています。

+0

したがって、基本的に同じバイナリにロードされた2つの共有ライブラリ異なる(ただし互換性のある)コンパイラでコンパイルされた場所でtime_t型のサイズが異なる可能性があります。 – GaretJax

+0

'time_t'の長さは、それを使用するライブラリがバイナリにコンパイルされると決定されます。クライアントのソースをコンパチブルにするには、コンパイル時に同じ設定を使用するだけです。 – Santa

+0

私はctypesと組み合わせてpyrexモジュールを使用していますが、sizeof(time_t)の結果を保持する定数を定義しました。私は使用されたコンパイルされた共有ライブラリの間で正しいサイズを保証することはできませんが、少なくとも現在使用しているコンパイラ設定(ライブラリが同じ設定でコンパイルされていることを期待しています)。 – GaretJax

関連する問題