在博客园开博客已经有了蛮长时间了,但是从来只是看别人的文章,自己却从未写过一篇技术文章,深表惭愧。内心还是希望能够给大家提供一些帮助的,希望这第一篇技术博客,能够给大家一些帮助。闲话少叙,开始正文。
最近在做和python相关的项目,需要对接C++算法库,这对于我这种刚刚接触python的新手来说,着实有些麻烦,而且,新平台又是在python3上进行的,因此还需要考虑到,python3与python2.7的不同之处,还真心感到有点混乱,不过经过努力终于成功的实现了,python与c++算法库的对接。现在将实现过程记录如下:
首先python是支持调用C库的,这也是python能够广泛被使用的原因之一,但是C++与C还是有所不一样,因此适用于C的方法,到了C++这里要做点相应的改动。如下:
在C++中有这样的类函数:
int ClassA :: process (char *p, int a, int b)
{
.......
}
将这个process接口函数 声明为C函数
extern "c"
{
ClassA c;
process_python(char* p, int a, int b){
c.process(p, a, b);
}
将c库用gcc 编译为.so,这个过程网上有很多,不赘述,直奔主题。python调用c的.so库不需要额外的封装接口,十分方便。将c++的接口函数声明为C类型后,就可以在python中直接使用了。是不是该结束?No,如果到此就结束了,网上有好多,我还写啥啊,这里要说的是后面实现的注意事项。
python 调用C函数的方法
在python中采用ctypes模块来进行调用,在python2.5之后,该模块都被集成在python中,不需要安装,直接使用即可。
#!/usr/bin/python3
from ctypes import *
import os
import sys
if __name__ == "__main__":
libtest = cdll.LoadLibrary(os.getcwd() + '/libprocess.so')
test = libtest.process_python
test.argtypes = [c_char_p, c_int, c_int] #这里要特别注意,一定要声明函数的输入类型,转化为C类型,不然C接口是不认识输入数据的
test(sys.argv[1].encode(), int(sys.argv[2]), int(sys.argv[3])) #这里也要注意,因为在python3中string和bytes不同,需要进行编解码转换,不然数据类型是不匹配的
#还有一点,C++中有string类,但是C语言中没有,所以接口函数如果有string类的要替换为char型
注意了以上几点就可以正常运行了,说来简单,但是自己摸索的时候,真心花费了大量时间,希望大家不要走重复的弯路。
最后,希望大家多多和我交流,提意见,有更好的实现方法和不足之处也欢迎大家,指出。不吝赐教哟~^_^