Windows下使用C++编写Python的扩展模块详细说明

3031 人浏览 | 时间: 2016-12-23 18:32:02 | 作者: codexia 会员文章,禁止转载

    在Windows系统实现C++编写Python的扩展模块,折腾了很久,找到一篇文章,简单明了,给了我很大帮助。因为文章里的代码排版问题,空格丢失,让数据类型和函数名称等黏在一块,也会让刚接触C++写Python扩展模块的人产生障碍。

    C++编写Python的扩展模块时总是提示Python.h找不到、提示python25_d.lib无法打开、提示Py_InitModule未定义的符号、链接时总是提示Py_InitModule等无法解析的外部符号。一路踩坑填坑,才踏平Windows上的C++编写Python的扩展模块问题。

    所以在此对这篇文章进行整理,方便更多人,这篇文章确实帮到我了。

    原文地址:http://blog.csdn.net/magictong/article/details/8897568

    原文标题:使用C++扩展Python的功能

    下面进行整理发布,作为对原作者的感谢,对于必要的地方会做完善修改:



环境
VS2005+Python2.5.4+Windows7(32位)

简介
    长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python来调用有点不一样(虽然本质是一样的)。而是指使用Python本身提供的API,使用C++来对Python进行功能性扩展,可以这样理解,使用更高效的语言实现一些算法计算等等需要更高执行效率的核心(或者需要与系统进行密切交互的)模块,然后让Python像调用内建标准库的方式来调用这些模块,听起来是不是很诱人?!在软件技术高速发展的今天,借助几种计算机语言来实现一个系统的例子数不胜数,目的不外乎就是性能和便利的平衡。譬如本文要讨论的使用C++来扩展Python就是Python和C++的一种巧妙的有机结合,好处不言而喻,既可以获得和C++相似的执行性能,又可以利用Python的开发灵活性。由于Python本身是使用C实现的,二者结合起来还是比较容易的。

基本流程
    本文不适合这样的读者——对Python完全不了解或者对C\C++完全不了解,道理你们懂的。另外就是Python里面有6种基本数据类型。你需要了解如何在C和Python之间对这些类型进行转化(这不在本文讨论范围,可以参考[1])。
    言归正传,感觉前面说得太多了,实际上很简单,因此我决定少说多做。一个C++的Python扩展模块至少应该有导出函数,方法列表和初始化函数三个部分。我们用VS2005这个强大的工具开工!一般来说,你应该建一个Dll工程(至于使用exe来扩展Python可以不可以,暂时还没研究过)。下面按部就班的说明(关键说明在注释部分)。

一、初始化函数
//-------------------------------------------------------------------------
// 函数        : initPyExt
// 功能        : 初始化函数
// 返回值      : PyMODINIT_FUNC
// 附注        : 注意,这个函数的名字不能改动。必须是init+模块名字,
// 我们的模块名字是PyExt,所以函数名是initPyExt。Python在导入
// 我们的PyExt模块时,会找到这个函数,并调用。这个函数实现的
// 功能很简单,通过调用Py_InitModule将模块名字和映射表结合起
// 来,它的意思是说PyExt这个模块使用PyExtMethods这个映射表。
//-------------------------------------------------------------------------
PyMODINIT_FUNC initPyExt()
{
    Py_InitModule("PyExt",PyExtMethods);
}

二、方法列表
/*
      方法列表,这个是一个C结构数组。把需要扩展的函数都映射到这个表里。
      那么Python就知道你的这个扩展模块支持一些什么方法了。表的第一个字
      段是方法名字,也是通过Python来调用时的名字。第二个字段是导出函数,
      是真正调用的函数,也是C\C++实现的函数。第三个参数是指明Python向
      C\C++函数传递参数的形式。可选的两种方式是METH_VARARGS和
      METH_KEYWORDS,其中METH_VARARGS是参数传递的标准形式,它通
      过Python的元组在Python解释器和C函数之间传递参数,若采用
      METH_KEYWORD方式,则Python解释器和C函数之间将通过Python的字典
      类型在两者之间进行参数传递。第四个字段是这个函数的说明。如果你在
      python里来help这个函数,将显示这个说明。相当于在python里的函数的文档说明。
*/
static PyMethodDef PyExtMethods[]=
{
       {"Add", Add,METH_VARARGS,"Addtwo number - edit by magictong."},
       {"ExecSystem",ExecSystem,METH_VARARGS,"Execute a shell command - edit by magictong." },
       {NULL,NULL, 0,NULL}
};
三、导出函数
//-------------------------------------------------------------------------
// 函数        : Add
// 功能        : 这是一个加法函数
// 返回值    
开通会员>>阅读全文
标注
评论
站内搜
百度搜
传送到手机
手机扫码,识别文字,完成传送x
加载中...
标注内容x
加载中...
添加标注x
收藏 0 点赞 0