专栏首页python3Python笔记(二)——python调

Python笔记(二)——python调

前一篇讲了简单的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脚本的性能,也是为了交互。更多的好处还得在使用中得以体现。有什么说得不对的地方还望大家批评!【待续】

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python调用DLL

    C语言中的函数默认是__cdecl调用,C++中可用__stdcall来显示声明调用,但也可以用extern “C”

    py3study
  • Python回顾与整理3:数字

    数字用的次数是否多主要是看需求,如果是做自动化运维平台开发,比如做一个自动监控的系统,那么你肯定需要收集一定量的数据,然后再对这些数据做一定的处理,那么这时候...

    py3study
  • python urllib & urll

     from: http://www.cnblogs.com/yuxc/archive/2011/08/01/2124073.html

    py3study
  • 1094 谷歌的招聘 (20 分)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    韩旭051
  • 以太坊智能合约编码安全之Call注入

    Solidity作为一种用于编写以太坊智能合约的图灵完备的语言,除了常见语言特性以外,还提供了调用/继承其他合约的功能。在call、delegatecall、c...

    周俊辉
  • 洛谷P1435 回文字串(dp)

    首先不难看出,这题跟LCS有关,而且是魔改版的LCS,具体来说,我们要求的是前缀$1 - i$的反串和后缀$i - n$的LCS。

    attack
  • 替换空格

    题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。       ...

    猿人谷
  • 数组中的逆序对

    题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

    Dabelv
  • Java中如何实现原子操作?

    在Java中,J实现原子操作 可以通过锁和循环CAS的方式来实现原子操作。 1 使用循环CAS操作原子操作 package com.yy;

    爱明依
  • Word2vec原理浅析及tensorflow实现

    词向量的重要意义在于将自然语言转换成了计算机能够理解的向量。相对于词袋模型、TF-IDF等模型,词向量能抓住词的上下文、语义,衡量词与词的相似性,在文本分类、情...

    用户1332428

扫码关注云+社区

领取腾讯云代金券