我最近发现了cffi
Python模块,我想用它为我用Python编写的一些C代码编写单元测试。我无法确定的一件事(可以说很简单)是如何将多个C源文件编译成一个Python模块,然后可以通过Python代码将其导入。
例如,我有四个C文件,a.c
,a.h
,b.c
和b.h
,这样a.c
既包含a.h
又包含b.h
,并调用在b.c
中实现的函数。并且b.c
仅包含b.h
。
如果我想为在b.c
中实现的功能编写单元测试,我可以简单地做到这一点:
import cffi
with open('b.h', 'r') as f:
b_h = f.read()
with open('b.c', 'r') as f:
b_c = f.read()
ffi = cffi.FFI()
ffi.cdef(b_h)
ffi.set_source('_b', b_c)
# import _b ...
但是如果我想为a.c
中定义的函数编写单元测试该怎么办?
答案 0 :(得分:1)
核心思想是使用:
ffi.set_source("_mytest", '''
#include "a.h"
''', sources=["a.c", "b.c"])
编译包含a.c
和b.c
并包含a.h
的模块,该模块本身包含b.h
。这使用distutils argument sources=[..]
来提供其他要编译到同一扩展模块中的源文件。在该行上方,您可以在您感兴趣的C声明上使用ffi.cdef()
-通常是a.h
和b.h
的子集。 (您可以多次调用ffi.cdef()
,也可以在串联多个片段后的字符串上调用一次。)