ctypes/cffi 模块允许 Python 直接加载并调用动态链接库中的 C 函数,不需要编写 C 代码进行包装。其中 ctypes 是 Python 的内置库,而 cffi 是第三方库,性能更好且支持 PyPy.缺点是不支持 C++ 库(因为有 Name Mangling 和重载),只能 C 库。

使用方法是:

  • 先将 C 语言代码编译出 .dll/.so 动态库
  • 在 Python 里 import ctypes,然后用 lib = ctypes.CDLL('xxxx.so') 加载动态库
  • 对于每一个要调用的函数,定义其
    • 参数类型 lib.<function_name>.argtypes
    • 返回类型 lib.<function_name>.restype
  • lib.<function_name>(......) 调用函数

对于 lib.<function_name>(......) 中的函数参数,需要用 ctypes 中定义的 C 语言类型,如 c_int64 等等;遇到自定义数据类型的时候,还需要用 c_pointer 进行传递.

1
# toy example