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语言动态库案例
在Ubuntu系统中使用Python调用C程序,通常需要将C代码编译为动态链接库(.so文件),然后在Python代码中导入并使用。这涉及到创建C源代码文件、编写Python扩展模块、以及正确编译和安装这些模块。 3. 使用gcc编译C...
自己整理所得,当然菜鸟可以来看看,高手就可以略过啦
总之,Python调用C语言函数的能力极大地扩展了Python的适用范围,使得开发者能够在保持代码可读性和开发速度的同时,利用C语言的高性能特性。理解并掌握这一技术,对于从事软件开发的人员来说,是非常有价值的。
在IT行业中,有时候我们需要在不同的编程语言之间进行交互,例如Python和C语言。在这个场景下,可能会遇到需要从C语言的头文件(如`.h`文件)中提取信息的需求。标题提到的“python读取C语言头文件测试用例”正是...
在C语言中调用Python非常简单,不过涉及到一些小窍门。 下面的C代码告诉你怎样安全的调用: #include <Python> /* Execute func(x,y) in the Python interpreter. The arguments and return result of the function...
在C++中,我们需要编写一个DLL,包含一些可供Python调用的函数。比如,我们可以创建一个名为`CreateDll`的DLL,里面有一个函数`addNumbers`,接受两个整数参数并返回它们的和。在C++中,这个函数可能这样声明: `...
本文档介绍了如何使用Python调用用C语言或C++编写的动态链接库(DLL),这对于计算机视觉和人工智能领域的开发者尤为有用,因为他们可以使用性能更高的语言编写算法,同时在Python中享受高级特性和丰富的库。...
因此,了解如何让Python调用C代码是提高应用性能和扩展性的关键技能之一。 #### 二、Python调用C程序的方式 根据不同的需求和应用场景,Python调用C程序主要有以下几种方式: 1. **ctypes** - **简介**:`ctypes...
在Python编程中,有时我们需要利用C语言编写的高效底层代码,这时就需要用到Python调用C语言动态库的功能。本文将通过一个简单的加法运算示例来阐述这一过程。 首先,我们有一个C语言动态库的源码文件`add.c.txt`,...
现在我们已经准备好了调用C函数的所有元素,可以直接在Python中调用`add_func`函数,就像调用Python函数一样。 ```python result = add_func(3, 5) print(result) # 输出:8 ``` 5. **处理复杂数据类型和错误**:...
在Python编程中,有时我们需要利用C或C++的高性能特性,这时就需要进行Python与C/C++的混编。本文将详细讲解如何在Python中调用C...在实际开发中,还需要考虑错误处理、内存管理等问题,确保C扩展的稳定性和安全性。
Python 解决调用Word2007时出现“尚未调用Colnitialize”错误 Python源码Python 解决调用Word2007时出现“尚未调用Colnitialize”错误 Python源码Python 解决调用Word2007时出现“尚未调用Colnitialize”错误 Python...
本篇将详细介绍这两个示例`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...
在IT行业中,跨语言交互是常见的...通过Python调用C语言编写的DLL,我们可以将复杂的二进制文件解析任务交给C语言,同时保持Python代码的简洁性和易用性。这种方法在处理大量数据和需要高性能读取的情况下特别有效。
标题“ctypes--Python调用c接口.pdf”表明文档讲述了Python中的ctypes模块,该模块用于Python程序调用C语言编写的动态链接库(DLLs)或共享库。Ctypes是Python的一个扩展库,允许Python代码直接操作C语言的数据类型...
总的来说,这个案例涵盖了Python调用C代码的关键步骤:编写C代码、使用VS2005创建和编译工程、生成Python可调用的二进制文件,以及在Python中通过`ctypes`模块加载和调用这些函数。这对于提升Python程序的性能、利用...
至于压缩包中的"JPythonTest",这可能是包含测试代码的文件或目录,可能包括Java和Python的示例代码,用于演示如何在Java中调用Python。在实际操作时,可以打开这个文件或目录,参照其中的示例进行学习和实践。 ...
使用Python调用OpenAI接口-OpenAI接口调用python库源码.zip使用Python调用OpenAI接口-OpenAI接口调用python库源码.zip使用Python调用OpenAI接口-OpenAI接口调用python库源码.zip使用Python调用OpenAI接口-OpenAI接口...