ctypes: 可直接调用c语言动态链接库。
使用步骤:
1>编译好自己的动态连接库
2>利用ctypes载入动态连接库
3>用ctype调用C函数接口时,需要将python变量类型做转换后才能作为函数参数,转换原则见下图:
4>Python若想获取ctypes调用的C函数返回值,需要先指定返回值类型。我们将在接下来的完整Sample中看到如何使用。
#Step 1: test.c#include <stdio.h>int add(int a, int b)
{
return a + b
}#Step 2: 编译动态链接库 ( 如何编译动态链接库在本文不详解,网上资料一大堆。)gcc -fPIC -shared test.c -o libtest.so
#Step 3: test.py
from ctypes import *mylib = CDLL("libtest.so") 或者 cdll.LoadLibrary("libtest.so") add = mylib.add
add.argtypes = [c_int, c_int] # 参数类型,两个int(c_int是ctypes类型,见上表)
add.restype = c_int # 返回值类型,int (c_int 是ctypes类型,见上表)
sum = add(3, 6)
可以的。C中内嵌Python
新建立一个工程,首先需要将工作目录设置到Python-3.1.1PCbuild中,以获取到动态库,至于静态库的包含,Include目录的指定,那自然也是少不了的。文件中需要包含Python.h文件,这也是必须的。
接口中
Py_Initialize()
Py_Finalize()
其他的根据需求,再引入相应的python builder 即可
这个事情做过好多遍,摸索的过程基本这样的:1. 通过stdout通信...土到爆,但上手极快,简单粗暴;
2. 调用原始的python.h 接口,编写可以被python import 的so,支持python调用c++接口,c++接口调用python同样的方式;
3. 使用boost-python 完成2中的功能,接口简单很多,本质上没有不同;
这里遇到的主要几个问题在于:
1. 数据的序列化反序列化,因为有时c++和python之间通信的不是基本类型,可能是用户自定义类型;
2. 多线程的问题,c++多线程调python接口时,需要注意GIL的使用,貌似因为python解释器不是线程安全的;
3.
对象传递,大多数情况下,如果只是静态接口调用,都比较简单,考虑一种情况:c++中的对象的一个函数调用python一个接口,这个python接口中
又需要反过来调用这个对象中的另一个接口,这里就需要考虑怎么把对象相互传递,我这里是把对象指针地址传递到python中,在python中调用一个
c++的静态接口,带上地址和其他需要的参数,在这个c++的静态接口中,把地址转换成指针在调用..