环境
ubuntu16.04
python3.5.1+
cffi 1.7.0
安装
pip install cffi
简介
CFFI(Foreign Function Interface for Python calling C)可以用作以下四种模式:ABI in-line,ABI out-line,API in-line,API out-line。
ABI模式是通过二进制文件调用库函数,而API模式是通过C编译器调用库函数,下面会有详细举例。
在in-line模式里,当你运行Python代码是所有库都会重新加载,而在out-line模式,你可以预先把要调用的代码编译成模块然后再加载。
简单的例子(ABI level,in-line)
from cffi import FFI
ffi = FFI()
ffi.cdef("""
int printf(const char *format, ...); // 可以从man page或者头文件里面复制
""")
C = ffi.dlopen(None) # 加载整个C命名空间
arg = ffi.new("char[]", b"world") # 等于C代码: char arg[] = "world";
print(C.printf(b"hi there, %s.\n", arg)) # 调用printf
#返回结果
hi there, world.
17
这个例子没有使用任何C编译器。这就是所说的ABI模式,在该模式下,如果去访问没有在cdef()中定义过的函数或者结构体,程序就会崩溃。
如果你的环境中有C编译器,强烈推荐使用API模式(该模式比ABI模式更快),下节接着介绍...