`
j2002sx
  • 浏览: 35338 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

在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

 

分享到:
评论

相关推荐

    python调用c语言动态库案例

    python调用c语言动态库案例

    Ubuntu系统中Python无缝调用C程序的实现.pdf

    在Ubuntu系统中使用Python调用C程序,通常需要将C代码编译为动态链接库(.so文件),然后在Python代码中导入并使用。这涉及到创建C源代码文件、编写Python扩展模块、以及正确编译和安装这些模块。 3. 使用gcc编译C...

    c语言调用python脚本

    自己整理所得,当然菜鸟可以来看看,高手就可以略过啦

    python调用C的例子

    总之,Python调用C语言函数的能力极大地扩展了Python的适用范围,使得开发者能够在保持代码可读性和开发速度的同时,利用C语言的高性能特性。理解并掌握这一技术,对于从事软件开发的人员来说,是非常有价值的。

    python读取C语言头文件测试用例,参考博客,有详细说明

    在IT行业中,有时候我们需要在不同的编程语言之间进行交互,例如Python和C语言。在这个场景下,可能会遇到需要从C语言的头文件(如`.h`文件)中提取信息的需求。标题提到的“python读取C语言头文件测试用例”正是...

    C语言调用Python代码的方法

    在C语言中调用Python非常简单,不过涉及到一些小窍门。 下面的C代码告诉你怎样安全的调用: #include <Python> /* Execute func(x,y) in the Python interpreter. The arguments and return result of the function...

    Python中调用C++dll例子

    在C++中,我们需要编写一个DLL,包含一些可供Python调用的函数。比如,我们可以创建一个名为`CreateDll`的DLL,里面有一个函数`addNumbers`,接受两个整数参数并返回它们的和。在C++中,这个函数可能这样声明: `...

    python调用C与C++语言.pdf

    本文档介绍了如何使用Python调用用C语言或C++编写的动态链接库(DLL),这对于计算机视觉和人工智能领域的开发者尤为有用,因为他们可以使用性能更高的语言编写算法,同时在Python中享受高级特性和丰富的库。...

    python调用c程序

    因此,了解如何让Python调用C代码是提高应用性能和扩展性的关键技能之一。 #### 二、Python调用C程序的方式 根据不同的需求和应用场景,Python调用C程序主要有以下几种方式: 1. **ctypes** - **简介**:`ctypes...

    python调用C语言动态库例程

    在Python编程中,有时我们需要利用C语言编写的高效底层代码,这时就需要用到Python调用C语言动态库的功能。本文将通过一个简单的加法运算示例来阐述这一过程。 首先,我们有一个C语言动态库的源码文件`add.c.txt`,...

    python调用C语言.zip

    现在我们已经准备好了调用C函数的所有元素,可以直接在Python中调用`add_func`函数,就像调用Python函数一样。 ```python result = add_func(3, 5) print(result) # 输出:8 ``` 5. **处理复杂数据类型和错误**:...

    Python调用C函数实例

    在Python编程中,有时我们需要利用C或C++的高性能特性,这时就需要进行Python与C/C++的混编。本文将详细讲解如何在Python中调用C...在实际开发中,还需要考虑错误处理、内存管理等问题,确保C扩展的稳定性和安全性。

    Python 解决调用Word2007时出现“尚未调用Colnitialize”错误 Python源码

    Python 解决调用Word2007时出现“尚未调用Colnitialize”错误 Python源码Python 解决调用Word2007时出现“尚未调用Colnitialize”错误 Python源码Python 解决调用Word2007时出现“尚未调用Colnitialize”错误 Python...

    python调用C/C++ demo

    本篇将详细介绍这两个示例`pyton_C`和`python_C++`所展示的Python调用C/C++的方法。 1. Python调用C:通过`ctypes`库 `ctypes`是Python的标准库之一,它允许我们直接调用C语言编写的动态链接库(.dll或.so文件)。...

    使用Python调用微信本地ocr服务.zip

    使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip使用Python调用微信本地ocr服务.zip...

    python调用c语言实现comtrade读取

    在IT行业中,跨语言交互是常见的...通过Python调用C语言编写的DLL,我们可以将复杂的二进制文件解析任务交给C语言,同时保持Python代码的简洁性和易用性。这种方法在处理大量数据和需要高性能读取的情况下特别有效。

    ctypes--Python调用c接口.pdf

    标题“ctypes--Python调用c接口.pdf”表明文档讲述了Python中的ctypes模块,该模块用于Python程序调用C语言编写的动态链接库(DLLs)或共享库。Ctypes是Python的一个扩展库,允许Python代码直接操作C语言的数据类型...

    Python调用c代码vs2005工程

    总的来说,这个案例涵盖了Python调用C代码的关键步骤:编写C代码、使用VS2005创建和编译工程、生成Python可调用的二进制文件,以及在Python中通过`ctypes`模块加载和调用这些函数。这对于提升Python程序的性能、利用...

    Java中调用Python代码

    至于压缩包中的"JPythonTest",这可能是包含测试代码的文件或目录,可能包括Java和Python的示例代码,用于演示如何在Java中调用Python。在实际操作时,可以打开这个文件或目录,参照其中的示例进行学习和实践。 ...

    使用Python调用OpenAI接口-OpenAI接口调用python库源码.zip

    使用Python调用OpenAI接口-OpenAI接口调用python库源码.zip使用Python调用OpenAI接口-OpenAI接口调用python库源码.zip使用Python调用OpenAI接口-OpenAI接口调用python库源码.zip使用Python调用OpenAI接口-OpenAI接口...

Global site tag (gtag.js) - Google Analytics