2013-10-14 22 views
2

我正在使用CFFI從Python中調用返回結構的Python函數。該結構由time_t元素定義。如何將結構聲明爲CFFI,以便我可以從Python訪問它?在Python中聲明包含time_t字段的結構CFFI

例如,我嘗試了以下(以獲得文件的修改時間):

import cffi 
ffi = cffi.FFI() 
ffi.cdef(""" 
    // From POSIX 
    struct timespec { 
     time_t tv_sec; 
     long tv_nsec; 
     ...; 
    }; 
    struct stat { 
     struct timespec st_mtim; 
     ...; 
    }; 
    // From "man 2 lstat" 
    int lstat(const char *path, struct stat *buf); 
""") 
stat = ffi.verify("#include <sys/stat.h>") 

這給出了一個錯誤:

cffi.api.CDefError: cannot parse "    time_t tv_sec;"       
:5: before: time_t                  

它註釋掉行time_t tv_sec;之後編譯,但當然你不能訪問tv_sec字段。據推測,CFFI的C語法分析器不支持typedefs。您不能只用time_t替換實際的類型,因爲類型在不同的平臺上可能會有所不同。

+1

見我非常類似的回答與工作代碼[獲取文件的修改時間納秒的精度] [1] [1]:http://stackoverflow.com/questions/19351867/get-file-modification-time-to-nanosecond-precision –

回答

3

我擔心沒有很好的答案。您需要編寫typedef long time_t;或類似的函數,假設time_t的大小始終與長度相同。如果代碼應該是移植到平臺上,其中time_t的可能是不同的,那麼你就需要分別得到大小:

ffi1 = cffi.FFI() 
ffi1.cdef("""#define SIZE_OF_TIME_T ...""") 
lib = ffi1.verify(""" 
    #include <sys/types.h> 
    #define SIZE_OF_TIME_T sizeof(time_t) 
""") 
size_of_time_t = lib.SIZE_OF_TIME_T 
+1

這已被固定在最近的版本CFFI的。現在你可以在使用''time_t''之前在cdef()中聲明'typedef int ... time_t;''。這意味着「time_t是一些整數類型,請向編譯器詢問其大小和簽名」。 –