在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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值