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

Posted

技术标签:

【中文标题】在 Python CFFI 中声明包含 time_t 字段的结构【英文标题】:Declare struct containing time_t field in Python CFFI 【发布时间】:2013-10-21 14:06:01 【问题描述】:

我正在使用 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 <sys/stat.h>")

这给出了一个错误:

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

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

【问题讨论】:

在 [Get file modify time to nanosecond precision][1] [1]: ***.com/questions/19351867/… 中查看我与工作代码非常相似的答案 【参考方案1】:

我担心没有好的答案。你需要写typedef long time_t; 或类似的,假设time_t 的大小总是和long 一样。如果代码应该可移植到 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

【讨论】:

这已在最新版本的 cffi 中得到修复。现在您可以在 cdef() 中输入 typedef int... time_t;,然后再使用 time_t。它的意思是“time_t 是一些整数类型,请向编译器询问它的大小和符号”。

以上是关于在 Python CFFI 中声明包含 time_t 字段的结构的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CFFI 将包含其标头的 C 库包装到 python 程序中?

访问 cffi 枚举

没有名为 _cffi_backend 的模块

在 Windows 上安装 python 库 cffi

Python cffi被windows defender隔离

如何使用 Python CFFI 正确包装 C 库