Python 调用 C/C++ 的程序主要有两种方式:
使用 ctypes 调用动态库
ctypes 的方式相对来说成本较低,首先 ctypes 是内置库,使用方便,使用的过程中与 C/C++ 动态库的逻辑是完全独立的,互相可以单独维护。但是相对也有明显的缺点,C++ 在编译后的函数名会变,ctypes 使用起来不方便,API 相对也比较繁琐,写起来略微麻烦一些,使用出错的话会导致进程退出。
本文主要介绍 ctypes 的基本用法,可以对现有的 C/C++ 代码进行简单的二次封装后进行使用。笔者认为 ctypes 本身还是比较适合轻量级的使用场景,如果逻辑较为复杂的,请考虑使用 C/C++ 扩展的方式。
本文的 Python 以 2.7 版本为例,编译使用 gcc。
简单示例
写一个简单的 Hello 来说明一下最基本的用法。首先定义一个简单的 c 函数。
//hello_module.c
#include
int hello(const char* name) {
printf("hello %s!\n", name);
return 0;
}
编译生成动态库,动态库不同的系统后缀不同(Windows 的 dll,Linux 的 so,Mac 的 dylib),需要注意,本文以 so 为例。
gcc -fPIC -shared hello_module.c -o hello_module.so
通过 ctypes 来进行动态库加载及函数调用,注意 windows 的调用方式有专有的 API。
import ctypes
lib = ctypes.cdll.LoadLibrary("hello_module.so")
lib.hello("world") # hello world!
以上便是简单的 ctypes 使用流程,加载动态库,然后就可以调用动态库中的函数。
有几点需要注意的地方:
类型的隐私转换的,python 的 str 转换为了 c 的