在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

 

你可能感兴趣的:(C++,c,python,C#,gcc)