设为首页 收藏本站
查看: 875|回复: 0

[经验分享] Python笔记(二)——python调用C/C++模块

[复制链接]

尚未签到

发表于 2017-4-23 08:53:20 | 显示全部楼层 |阅读模式
  前一篇讲了简单的C/C++调用Python脚本模块(.py)。既然是用于诸多游戏程序的脚本语言,那肯定是缺不了互调(礼尚往来)。因此,本篇讲一个简单的python调用C/C++写的DLL模块,对Python进行功能扩展。这里写一个简单的例子,主要就为了了解下这么用Python来调用C/C++写的DLL库。好了,切入正题:
  首先,我是用VS2003建的一个DLL工程,将DLL工程属性里面的输出文件的(.dll)改为(.pyd)。当然也可以将生成后的DLL扩展名改为.pyd。呵呵!免得大家以为它很神秘(VC还能生成.pyd库?这种疑问!)好,直接贴代码:
  #include <Python.h>
  int cmd( const char *arg )
{
int n = system( arg );
return n;
}
  
static PyObject * wrap_cmd_fun( PyObject *self, PyObject *args )
{
const char * command;
if ( !PyArg_ParseTuple( args, "s", &command ) )
return NULL;
  int n = cmd( command );
return Py_BuildValue( "i", n );
}
  
static PyMethodDef MyCppMethods[] =
{
{ "MyCppFunc", wrap_cmd_fun, METH_VARARGS, "Execute a shell command." },
{ NULL, NULL, 0, NULL }
};
  
PyMODINIT_FUNC initMyFirstPythonModule( void )
{
PyObject *m = Py_InitModule( "MyFirstPythonModule", MyCppMethods );
if (m == NULL)
  return;
}
  这个实例很简单,首先是Py_InitModule用于初始化在Python脚本中要import的模块,这里的模块名是:MyFirstPythonModule。我们在Python中将使用import MyFirstPythonModule 来载入这个模块。这里我们将MyCppMethods作为模块要调用的方法,它是一个PyMethodDef结构。我们可以看到这个结构的数组定义,{ "MyCppFunc", wrap_cmd_fun, METH_VARARGS, "Execute a shell command." }, 红色的就是我们在脚本里面要调用的函数名字,它被映射为wrap_cmd_fun,当在Python脚本中调用MyCppFunc时将会调用wrap_cmd_fun函数。第三个METH_VARARGS成员表示调用方式,可以用或运算连接几个调用方式。第四个成员是一个方法的说明,这里说明他是一个用来执行控制台命令的。数组的第二个元素{ NULL, NULL, 0, NULL } 表示函数列表结束,结束就用NULL。言外之意就是我们可以再这个结构数组中映射多个C/C++函数用于python来调用。
  wrap_cmd_fun函数就不用我来解释了吧,一看就懂,就是将Python调用时传进来的参数转化成字符串,然后调用cmd函数,返回值是整型,又传回给python程序。
  给出一个格式化时的"i", "s"之类的Python脚本类型说明表:
格式化字符
C数据类型
Python类型
s

char*

字符串
s#

char*, int

字符串及长度
z

char*

与s相同,但可以为NULL
续表

格式化字符
C数据类型
Python类型
z#

char*, int

与s#相同,但可以为NULL
i

int

长整型
l

long int

长整型
c

char

单个字符的字符串
f

float

双精度型
d

double

双精度型
  好了,我们开始编译,编译出来的库文件为:MyFirstPythonModule.pyd
  之后我们写Python脚本:
  import MyFirstPythonModule #引用库文件。
input = MyFirstPythonModule.MyCppFunc( "dir" ) #调用函数,传入得是dir命令。
print input #将返回值打印出来。
  好了!就这么简单。之所以用CC++模块的形式,是为了提高Python脚本的性能,也是为了交互。更多的好处还得在使用中得以体现。有什么说得不对的地方还望大家批评!【待续】
  【Python笔记目录】
  1. Python笔记(一)——C/C++调用python
  2. Python笔记(二)——python调用C/C++模块

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-367997-1-1.html 上篇帖子: Python/Django学习笔记(1):初识Python语言 下篇帖子: python 笔记(转载)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表