Python CFFI Overview
CFFI 是 Python 和 C 交互的一个库,它有 ABI x in-line, ABI x out-of-line, API x in-line, API x out-of-line 四种接口。
ABI 驳接的是已经编译好的 binary,API 更快,把 C 代码编译出来使用。 in-line 是在 Python 中每次使用都要 setup,out-of-line 则需要提前生成好模块,然后在主程序中调用。
ABI x inline:
ffi = FFI()
ffi.cdef("""C SOURCE HERE""")
C = ffi.dlopen(None)
C.printf("…")
API, out-of-line
编译
ffi = FFI()
ffi.set_source("my_module", """C SOURCE HERE""")
ffi.cdef("""DECLAREATIONS""")
if __name__ == '__main__':
ffi.compile()
使用前需要运行脚本, 生成 my_module.c 源码然后编译成 my_module.so / my_module.pyd。可以向普通 Python 模块一样调用:
from my_module import lib
lib.print("hello")
ABI, out-of-line
ffi = FFI()
ffi.set_source("my_module", None)
ffi.cdef("""C SOURCE HERE""")
if __name__ == '__main__':
ffi.compile()
也要运行它生成 my_module.py。使用:
from my_module import ffi
lib = ffi.dlopen(None)
lib.print(b"hello")
一些限制:
- cdef 只能支持 types, functions, constants, global variables, 不支持 #ifdef 这些宏。
- API in-line 现在已经废弃了。