您所在的位置: 首页>>读书频道>>设计开发>>其它开发>>

8.1.2 程序详解

http://book.51cto.com  2007-10-16 13:31  孙广磊  人民邮电出版社  我要评论(0)

8.1.2  程序详解

一般的Python扩展程序中应包含以下3部分内容

1.初始化函数
初始化函数是必须的,用于Python解释器对模块进行正确的初始化。初始化函数的函数名必须以init开头,并加上模块的名字。例如上节中初始化函数的函数名为“initmyext”,其中“myext”为模块名。函数“initmyext”代码如下所示。

   

PyMODINIT_FUNC initmyext()
{
PyObject *mod;
mod = Py_InitModule("myext",myextMethods);
}

其中PyMODINIT_FUNC为Python头文件中定义的宏,在Windows下其相当于_declspec(dllexport) void,即将initmyext声明为void型,并且将其设为DLL文件的导出函数。初始化函数中的Py_InitModule函数,其函数原型如下所示。

PyObject* Py_InitModule( char *name, PyMethodDef *methods)
其参数含义如下。

• name:模块名。
• methods:方法列表。

2.方法列表
方法列表中包含了Python扩展中的所有可以调用的函数方法。方法列表应该被声明为“static PyMethodDef”。上一节实例中的方法列表如下所示。

    

static PyMethodDef myextMethods[] =
{
{"show", show, METH_VARARGS,"show a messagebox"},
{NULL,NULL}
};

每一个函数方法对应于方法列表中的由大括号包围的一项。大括号中由4部分组成,模块中的方法名,与之对应的Python扩展中的函数名、函数调用方法,以及方法描述。其中函数调用方法应该为“METH_VARARGS”或者“METH_VARARGS | METH_KEYWORDS”。也可以将函数调用方法设置为0。方法列表应该以由两个NULL组成的一项来表示结束。

3.函数实现
方法列表中包含了模块中方法对应的C语言函数实现。在Python扩展中所有的函数都应该被声明为“PyObject *”型,每个函数都应当含有两个“PyObject *”型的参数。在上一节的实例中,模块方法的实现函数如下所示。

    

PyObject *show(PyObject *self, PyObject *args)
{
char *message;
const char *title = NULL;
HWND hwnd = NULL;
int r;
if (!PyArg_ParseTuple(args, "iss", &hwnd, &message, &title))
return NULL;
r = MessageBox(hwnd,message, title, MB_OK);
return Py_BuildValue("i", r);
}

其中参数self只有在函数为Python的内置方法时才被使用,其余情况下self为一个空指针。参数args为在Python中向方法传递的参数。如果在方法列表中指定的函数调用方法为“METH_VARARGS”,则在函数中使用PyArg_ParseTuple处理参数。如果在方法列表中指定的函数调用方法为“METH_VARARGS | METH_KEYWORDS”,则应该使用PyArg_ParseTupleAndKeywords处理参数。其中PyArg_ParseTuple的函数原型如下所示。
int PyArg_ParseTuple( PyObject *args, const char *format, ...)
其参数含义如下。

 args:传递的参数。
• format:参数类型描述。

PyArg_ParseTuple为可变参数函数,其后的参数即在函数中接受Python中传递参数的变量。在上述的show函数中,要使用3个参数,分别为hwnd、message、title。在PyArg_ParseTuple中将其作为参数,使用“&”向hwnd、message、title传递值,即将Python向show方法传递的参数依次赋值给hwnd、message、title。

PyArg_ParseTuple函数中的format参数指定了其后参数的类型,在show函数中format参数为“iss”表示hwnd为整型,message和title为字符串。常见的指定参数类型的字符如表8-1所示。

表8-1 常见的指定参数类型的字符

格式化字符

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

双精度型

【责任编辑:杜书 TEL:(010)68476606】

回书目   上一节   下一节
Windows Home Server 家用服务器专题
程序员如何成长?
Windows Server 2008专题
windows网络安全指南
赛门铁克诺顿误杀Windows系统文件 导致百万系统崩溃
 
 验证码: (点击刷新验证码)   匿名发表
  • 野蛮生长

  • 作者:冯仑著
  • “地产界的思想家”冯仑纵横生意江湖20年来,第一次系统梳理出书。  三十年来中国民营企业从前公司时代发展到公司时代,21..
Copyright©2005-2008 51CTO.COM 版权所有