Declare struct containing time_t field in Python CFFI

限于喜欢 提交于 2019-12-13 14:28:00

问题


I am using CFFI to call a C function from Python that returns a struct. The struct is defined with a time_t element. How do I declare the struct to CFFI so that I can access it from Python?

For example, I tried the following (to get the modified time of a file):

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

This gives an error:

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

It does compile after commenting out the line time_t tv_sec;, but then of course you can't access the tv_sec field. Presumably, CFFI's C parser doesn't support typedefs. You can't just replace time_t with the actual type, since the type may be different on different platforms.


回答1:


I fear there is no nice answer. You need to write typedef long time_t; or similar, assuming that time_t is always the same size as long. If the code is supposed to be portable to platforms where time_t might be different, then you would need to separately get the size:

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


来源:https://stackoverflow.com/questions/19352932/declare-struct-containing-time-t-field-in-python-cffi

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!