ICode9

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

使用Python的CFFI并排除系统头文件

2019-11-19 23:59:33  阅读:316  来源: 互联网

标签:gcc ctypes c-3 python python-cffi


我正在尝试使用Python’s CFFI开发与用C编写的科学模型的Python绑定.CFFI文档有点稀疏,我陷入了cdef阶段.

到目前为止,我的流程遵循以下步骤:

>预处理头文件:

gcc -E -gcc -std = c99 -E -P src / my_c_interface.c -I./include/ -I ../ shared / include /> header.txt

这将生成一个文本文件,其中包括我的include /目录的头文件中包含的所有C声明.它还包括标准库的声明(我很确定这是我的问题所在). header.txt看起来像这样(完整的header.txt为here):

从系统头文件开始:

typedef float float_t;
typedef double double_t;
extern int __math_errhandling(void);
extern int __fpclassifyf(float);
extern int __fpclassifyd(double);
extern int __fpclassifyl(long double);
extern __inline __attribute__((__gnu_inline__)) __attribute__ ((__always_inline__)) int __inline_isfinitef(float);
extern __inline __attribute__((__gnu_inline__)) __attribute__

并以我的标题中定义的片段结尾:

FILE *LOG_DEST;
void finalize_logging(void);
void get_current_datetime(char *cdt);
void get_logname(const char *path, int id, char *filename);

>使用cffi解析预处理的头文件:

import cffi

ffi = cffi.FFI()

with open('drivers/python/header.txt') as f_headers:
    ffi.cdef(f_headers.read())  # error is raised here

ffi.compile()

这将返回以下错误(完全回溯为here):

/Users/me/anaconda/lib/python3.4/site-packages/cffi/cparser.py in convert_pycparser_error(self, e, csource)
    157         else:
    158             msg = 'parse error\n%s' % (msg,)
--> 159         raise api.CDefError(msg)
    160 
    161     def parse(self, csource, override=False, packed=False):

CDefError: cannot parse "extern __inline __attribute__((__gnu_inline__)) __attribute__ ((__always_inline__)) int __inline_isfinitef(float);"
:10:17: before: __attribute_

鉴于我的位置,对于那些比我更熟悉cffi的人,我有几个问题:

>预处理器可以排除系统头吗?
>是否有人知道比cffi文档中显示的示例更复杂的示例?现实世界中的例子会有所帮助.
>查看上面显示的示例,我是否缺少主要的东西?

解决方法:

这是一个通用的答案:

尽管可以使用gcc -E方法并手动“修剪”结果,但建议不要使用CFFI.取而代之的是,cdef()代码通常是通过增量方式(根据需要添加功能)或从.h文件的已编辑副本中批量生成的.从手册页进行复制时,第一种方法效果最好.第二种方法是针对我们要完全访问单个第三方库的情况.

在所有情况下,很有可能您仍然需要编辑.h文件:建议的方法是使用ffi.set_source(),并从cdef()中删除所有多余的声明,将它们替换为…例如,实际的.h文件可能包含声明#define FOOBAR 42,但不应依赖值42(例如,将来可能会更改),因此cdef()应该接收#define FOOBAR .. ..

标签:gcc,ctypes,c-3,python,python-cffi
来源: https://codeday.me/bug/20191119/2039919.html

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

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

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

ICode9版权所有