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 现在已经废弃了。