8.1.2 程序详解
一般的Python扩展程序中应包含以下3部分内容
。
1.初始化函数
初始化函数是必须的,用于Python解释器对模块进行正确的初始化。初始化函数的函数名必须以init开头,并加上模块的名字。例如上节中初始化函数的函数名为“initmyext”,其中“myext”为模块名。函数“initmyext”代码如下所示。
|
其中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”。上一节实例中的方法列表如下所示。
|
每一个函数方法对应于方法列表中的由大括号包围的一项。大括号中由4部分组成,模块中的方法名,与之对应的Python扩展中的函数名、函数调用方法,以及方法描述。其中函数调用方法应该为“METH_VARARGS”或者“METH_VARARGS | METH_KEYWORDS”。也可以将函数调用方法设置为0。方法列表应该以由两个NULL组成的一项来表示结束。
3.函数实现
方法列表中包含了模块中方法对应的C语言函数实现。在Python扩展中所有的函数都应该被声明为“PyObject *”型,每个函数都应当含有两个“PyObject *”型的参数。在上一节的实例中,模块方法的实现函数如下所示。
|
其中参数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 |
双精度型 |
| 回书目 上一节 下一节 |