Python的C/C++扩展
Python
的
C/C++
扩展
By phidoit@gmail.com
可扩展性是
Python
的一大特色,一方面,由于
Python
是解释执行的,这导致运行速度会比编译型语言慢,因此可以通过使用
C/C++
重写核心部分代码以解决性能上的瓶颈
(
程序
90%
的时间再运行
10%
的代码
)
;另一方面,可以通过扩展,达到添加整合一些额外的功能以及保持专有源代码的目的。在本文接下来的部分中我们将讨论如何编写
C/C++
扩展代码,并使用它们的功能。
我们要建立的是一个可以在
Python
内运行的
C/C++
模块,因此需要解决如何使
C
代码和
Python
代码能够进行交互以及数据共享。扩展是通过为
C
代码编写包装函数
(
类似适配器
)
实现双向交互和数据共享的。
一.一般的包装模式
每一个包装函数主要做三件事:
1.
把输入的
Python
对象转换为
C/C++
对象;
2.
调用
C/C++
函数;
3.
转换
C/C++
函数处理的输出结果为
Python
对象,并返回;
先用一个简单样例描述模块大体的过程:
//wrap.cpp
//1.C代码
#include "Python.h"
int add(int arg1, int arg2)
{
return arg1 + arg2;
}
//2.add的包装函数:
static PyObject* wrap_add(PyObject *self, PyObject *args)
{
//把输入的Python对象转换为C/C++能识别的数据
int arg1, arg2;
if(!PyArg_ParseTuple(args, "ii", &arg1, &arg2))
return NULL;
//调用C/C++函数,得到结果
int result = add(arg1,arg2);
//把得到的结果包装成Python对象,并返回
return (PyObject*)Py_BuildValue("i", result);
}
//3.为模块添加PyMethodDef方法数组
static PyMethodDef wrap_methods[] ={
{"add", wrap_add, METH_VARARGS},
{NULL, NULL}
};
//4.增加模块初始化函数InitModule
PyMODINIT_FUNC initwrap (void)
{
Py_InitModule("wrap ", wrap_methods);
}
把上面的代码编译,生成
wrap.pyd
。
Visual Studio 2005
编译方法参考:
http://blog.csdn.net/solo_lxy/archive/2007/07/20/1700515.aspx
&
相关文档:
不知道怎么突然对VC编程感兴趣,其实我都不知道VC是个哈,就知道是程就像我现在学的最简单的PHP差不多吧,在PHP上咱也是个菜,还没学好就想学VC,我真是合自已没折,话不多话以下内容我是从谷歌里搜的,百度里有的,不是我写的东东,只是看了一哈在找个BLOG,转一下下~
一、VC是什么?学VC是学什么?
首先V ......
谁能帮我把这段代码转成Vb的代码,不胜感激,谢谢!
void CTempDlg::OnOK()
{
UpdateData(1);
int nlen=m_edit1.GetLength();
char *username=m_edit1.GetBuffer(nlen);//定义一个新字符串username,长度为nlen,并将m_edit1中的字符串一个个放入到username数组中
char strA[]="90123456 ......
今天,在Ubuntu上安装Python遇到了问题: C compiler cannot create executables。这应该是编译环境出现了问题。在网上搜索了一下,解决方法如下:
sudo apt-get install build-essential即可。
......
首先下载最新版本的Python,在这里我的版本是Python3.1.1。然后就是安装,切换到Python的文件目录下:
./configure
make
make test
sudo make install
在这里可能会遇到几个问题,第一个是在./configure时,可能会出现C compiler cannot create ......