通常为了扩展python的功能,我们需要将c库移植到python上面。python和c调用一般分成两种情况,一种是python调用c,这种情况最为普遍,也比较简单。另外一种就是c调用python,这种情况多出现在有回调函数的时候。
1、利用ctypes实现python调用c
用ctypes调用c是一种比较简单的方法,比如说,有这么一个c文件,
int add(int x, int y){
return (x+y);
}
我们首先将它编译成动态库的形式,
gcc -fPIC -shared -o libAdd.so add.c
有了这个动态库,我们就可以用ctypes调用它了,比如说python文件是这样的,
import ctypes
l = ctypes.CDLL("./libAdd.so");
num = l.add(3,4)
有了一个动态库,再加上这个python文件,基本上就可以完成python对c的调用了。
2、c调用python
这种情况多出现在回调函数上,比如说事件响应,定时器等等。一般的操作是这样的,假设有一个python文件,
def show(name):
print "this is ",name
为了实现c对python的调用,还需要一个c文件,
#include <Python.h>
int main() {
Py_Initialize();
if (!Py_IsInitialized()) return -1;
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
//import Module
PyObject* pModule = PyImport_ImportModule("hello");
if (!pModule) {
printf("Can't import Module!/n");
return -1;
}
//fetch Function
PyObject* pFunHi = PyDict_GetAttrString(pModule, "show");
PyObject_CallFunction(pFunHi, "s", "tim");
Py_DECREF(pFunHi);
//Release
Py_DECREF(pModule);
Py_Finalize();
return 0;
}
gcc process.c -I/usr/include/python2.7 -ldl -lutil -lpthread -lpython2.7 -o process