在python中调用C扩展和C扩展中调用python
1.python使用c扩展后,python程序也可支持多核下面是test_py_call_c.c的代码:
#include "Python.h"
static PyObject* mylooptest(PyObject *self, PyObject *args)
{
int i = 0;
Py_BEGIN_ALLOW_THREADS
while (1)
{
++i;
}
Py_END_ALLOW_THREADS
Py_INCREF(Py_None);
return Py_None;
}
static PyMethodDef mytestMethods[] =
{
{"mylooptest", mylooptest, METH_VARARGS, "for test use multi cpu"},
{NULL, NULL, 0, NULL}
};
void inittest_py_call_c(void)
{
Py_InitModule3("test_py_call_c", mytestMethods, "py call python test module");
}
编译成动态库,gcc -shared test_py_call_c.c -o test_py_call_c.so -I /usr/local/include/python2.5/
执行python
在python的命令行输入:
import test_py_call_c
from twisted.internet import reactor(注:这里使用了twisted,没用过的自己看help)
reactor.callInThread(test_py_call_c.mylooptest)
reactor.callInThread(test_py_call_c.mylooptest)
reactor.run()
这样python就同时在两个线程中运行test_py_call_c.mylooptest,此时可以看到CPU达到了180%,python也可以使用多核了。
2.c扩展中调用python函数
下面是test_c_call_py.c的代码
#include "Python.h"
PyObject *my_callback = NULL;
static PyObject* my_set_callback(PyObject *self, PyObject *args)
{
PyObject *result = NULL;
PyObject *temp = NULL;
if (PyArg_ParseTuple(args, "O", &temp)) {
if (!PyCallable_Check(temp)) {
PyErr_SetString(PyExc_TypeError, "parameter must be callable");
return NULL;
}
Py_XINCREF(temp);
Py_XDECREF(my_callback);
my_callback = temp;
Py_INCREF(Py_None);
result = Py_None;
}
return result;
}
static PyObject* my_test_callback(PyObject *self, PyObject *args)
{
PyObject * result = NULL;
result = PyEval_CallObject(my_callback, args);
if (result == NULL)
return NULL;
Py_DECREF(result);
Py_INCREF(Py_None);
return Py_None;
}
static PyMethodDef mytestMethods[] =
{
{"mysetcallback", my_set_callback, METH_VARARGS, "we set a call back function so that call it in C"},
{"mytestcallback", my_test_callback, METH_VARARGS, "we use this function to test call back function"},
{NULL, NULL, 0, NULL}
};
void inittest_c_call_py(void)
{
Py_InitModule3("test_c_call_py", mytestMethods, "c call python test module");
}
编译成动态库,gcc -shared test_c_call_py.c -o test_c_call_py.so -I /usr/local/include/python2.5/
在python命令行下:
敲入
def test(a,b,c):
print 'test %d, %d, %d\n' % (a, b, c)
test_c_call_py.mysetcallback(test)
test_c_call_py.mytestcallback(1,2,3)
最后显示:test 1, 2, 3
页:
[1]