三沣开发知识 购物 网址 游戏 小说 歌词 地图 快照 开发 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 编程 租车 短信 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题
autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml
html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
  IT知识库 -> python -> 使用C++扩展Python的功能详解 -> 正文阅读
 

[python]使用C++扩展Python的功能详解

使用C++扩展Python的功能详解 这篇文章主要介绍了使用C++扩展Python的功能详解,具有一定借鉴价值,需要的朋友可以参考下
本文主要研究的是使用C++扩展Python的功能的相关问题,具体如下。
环境
VS2005Python2.5.4Windows7(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_FUNCinitPyExt()
{
    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里的函数的文档说明。
*/
staticPyMethodDefPyExtMethods[]=
{
    {"Add", Add,METH_VARARGS,"Addtwo number - edit by magictong."},
    {"ExecSystem",ExecSystem,METH_VARARGS,"Execute a shell command - edit bymagictong." },
    {NULL,NULL, 0,NULL}
};

三、导出函数

//-------------------------------------------------------------------------
// 函数    : Add
// 功能    : 这是一个加法函数
// 返回值   :PyObject*
// 参数    : PyObject*self 这个参数我们暂时不用理会
// 参数    : PyObject*args 是一个参数列表,我们需要从它解析出参数
// 附注    :
// 所有的导出函数都具有相同的原型:
// PyObject*method(PyObject* self, PyObject* args);
//PyArg_ParseTuple来完成解析参数任务。它的第一个参数是args,
// 就是我们要转换的参数。第二个是格式符号。"s"代表是个string。
// 从args里提取一个参数就写"s",两个的话就写"s|s",如果是一个
// string,一个int,就写"s|i",有点和printf类似哦。第三个参数就是
// 提取出来的参数放置的真正位置。必须传递这个参数的地址。
//-------------------------------------------------------------------------
staticPyObject*Add(PyObject*self,PyObject*args)
{
    intx = 0 ;
    inty = 0;
    intz = 0;
    if(!PyArg_ParseTuple(args,"i|i", &x, &y))
       returnNULL;
    z=x +y;
    returnPy_BuildValue("i",z);
    /*
      调用完之后我们需要返回结果。这个结果是c的type或者是我们自己定义的类型。
      必须把他转换成PyObject,让python认识。这个用Py_BuildValue来完成。他
      是PyArg_ParseTuple的逆过程。他的第一个参数和PyArg_ParseTuple的第二个
      参数一样,是个格式化符号。第三个参数是我们需要转换的参数。Py_BuildValue
      会把所有的返回只组装成一个tutple给python。
 
      如果对应的C函数没有返回值(即返回值类型为void),则应返回一个全局的None
      对象(Py_None),并将其引用计数增,如下所示:
      Py_INCREF(Py_None);
      returnPy_None;
   */
}

四、再加点功能

intcmd(constchar* arg)
{
    returnsystem(arg);
}
 
staticPyObject*ExecSystem(PyObject*self,PyObject*args)
{
    constchar*command;
    if(!PyArg_ParseTuple(args,"s", &command))
       returnNULL;
    intn =cmd(command);
    returnPy_BuildValue("i",n);
}

编译
开编,编译出来的PyExt.dll文件改名为PyExt.pyd放入Python的C:\Python25\DLLs目录就可以全局使用了,如果你只想某个Python的工程,放在工程的相对路径下面就可以了。
使用

可能的问题
里面的这些PyMODINIT_FUNC,与Python相关的宏和定义在哪里呢?定义下#include<Python.h>就可以了,但是定义了之后提示Python.h找不到还是编译不过怎么办?这说明你没有安装Python或者安装了但是没有把头文件路径引入Path环境变量,或者你把Python的include目录加入工程的附加包含目录(Additional IncludeDirectories),一般是C:\Python25\include这个目录,其中C:\Python25是Python的安装目录,按你机器的实际情况配置)。
如果提示:Error 1 fatal error LNK1104:cannot open file 'python25_d.lib' 类似这样的错误,一般可能是没有安装Python的开发版本,没关系,你使用Release编译一下,如果还不行,就把C:\Python25\libs目录加入工程的附加库目录(Additional LibraryDirectories)。
总结
以上就是本文关于使用C++扩展Python的功能详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
您可能感兴趣的文章:Python与C++ 遍历文件夹下的所有图片实现代码Python和C/C++交互的几种方法总结C++调用Python基础功能实例详解C++/Php/Python/Shell 程序按行读取文件或者控制台的实现C++/Php/Python 语言执行shell命令的方法(推荐)浅谈c++调用python链接的问题及解决方法Python调用C++程序的方法详解
  python 最新文章
对python的文件内注释 help注释方法
Python实现判断一行代码是否为注释的方法
Python加载带有注释的Json文件实例
Python实现的根据IP地址计算子网掩码位数功
好的Python培训机构应该具备哪些条件
Python获取系统所有进程PID及进程名称的方法
请不要重复犯我在学习Python和Linux系统上的
python获取当前用户的主目录路径方法(推荐)
深入浅析ImageMagick命令执行漏洞
Python实现的百度站长自动URL提交小工具
上一篇文章      下一篇文章      查看所有文章
加:2018-01-16 23:30:51  更:2018-01-16 23:31:57 
 
技术频道: 站长资讯 .NET新手区 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA Visual Studio ASP.NET MVC .NET控件开发 Entity Framework WinRT/Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动设计 Html/Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP Oracle ERP Dynamics CRM K2 BPM 信息安全 企业信息化其他 Android开发 iOS开发 Windows Phone Windows Mobile 其他手机开发 敏捷开发 项目与团队管理 软件工程其他 SQL Server Oracle MySQL NoSQL 其它数据库 Windows 7 Windows Server Linux
脚本语言: vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程
网站开发: CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2018年7日历
2018-7-22 13:05:29
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT知识库