在Python CFFI中声明包含time_t字段的struct

我正在使用CFFI从Python调用一个返回结构的C函数。 结构使用time_t元素定义。 如何将结构声明为CFFI,以便我可以从Python访问它?

例如,我尝试了以下(获取文件的修改时间):

 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 ") 

这给出了一个错误:

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

它在注释掉行time_t tv_sec;之后编译time_t tv_sec; ,但当然你无法访问tv_sec字段。 据推测,CFFI的C解析器不支持typedef。 您不能只将time_t替换为实际类型,因为不同平台上的类型可能不同。

我担心没有好的答案。 你需要写typedef long time_t; 或类似的,假设time_t总是与长度相同。 如果代码应该可以移植到time_t可能不同的平台,那么你需要单独获取大小:

 ffi1 = cffi.FFI() ffi1.cdef("""#define SIZE_OF_TIME_T ...""") lib = ffi1.verify(""" #include  #define SIZE_OF_TIME_T sizeof(time_t) """) size_of_time_t = lib.SIZE_OF_TIME_T