Python笔记(二)——python调用C/C++模块
来源:互联网 发布:em算法实战 编辑:程序博客网 时间:2024/04/28 10:01
前一篇讲了简单的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++模块
- Python笔记(二)——python调用C/C++模块
- Python笔记(一)——C/C++调用python
- PYTHON 调用 C/C++模块
- C调用python,如何调用pymongo模块
- c和python混编,c调用python模块中的函数
- c和python混编,c调用python模块中的函数
- python调用C模块的方法
- Python使用bitey调用C模块
- Python与C/C++ 模块相互调用
- Python与C/C++ 模块相互调用
- Python与C/C++ 模块相互调用
- linux 下C调用Python 模块
- Python与C/C++ 模块相互调用
- linux 下Python调用C模块
- linux 下C调用Python 模块
- linux 下Python调用C模块
- linux 下Python调用C模块
- Python调用C模块和性能分析
- LINQ傻瓜教学之二:Left Join 和多字段关联
- 万圣节
- HTTP请求流程
- 从STL中的list删除元素
- Windows XP systrep工具
- Python笔记(二)——python调用C/C++模块
- YAHOO YUI工具库
- 计算机学科一个新知识框架(摘自ACM,转贴,理顺知识体系)
- 菜鸟的android开发笔记 之 第二弹 第一个程序HelloAndroid
- css tabs 2.0 我的修改版
- Microsoft Enterprise Library 5.0 is coming
- ERP实施的15规律
- ASP.NET MVC 入门 -- 8、ModelState与数据验证
- 设计模式(待续)