ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-11-22 17:06:46  阅读:303  来源: 互联网

标签:struct typedef c-3 python python-cffi


我正在使用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替换为实际类型,因为不同平台上的类型可能不同.

解决方法:

我担心没有好的答案.您需要编写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

标签:struct,typedef,c-3,python,python-cffi
来源: https://codeday.me/bug/20191122/2061365.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有