由于Python是解释性的脚本语言,执行速度较慢。在某些需要提高脚本执行效率的情况下,可以考虑扩展Python,用C/C++来完成对效率要求高的 部分。另外,由于Python功能强大,完全可以将其嵌入到C/C++中,以简化程序,减少代码。 8.1 扩展PythonPython提供了支持C/C++接口,可以方便地 使用C/C++来扩展Python。用C/C++编写的Python扩展主要用于完成底层的系统操作,以及提高执行速度等。 8.1.1 扩展概述Python提供了接口API,通过使用API函数 可以编写Python扩展。在Windows下可以使用VC来编译Python扩展。在UNIX和Linux下则可以使用gcc来编译。 1.设置编程环境使用VC时需要设置一些头文件以及库文件的包含目 录。如果使用VC++ 6.0,则设置过程如下所示。 (1)单击【Tools】|【Options】命 令,弹出如图8-1所示的对话框。 (2)单击【Directories】标签,选择 【Show directories for】下拉列表框中的【Include files】项,将Python安装目录下的INCLUDE目录添加到【Directories】列表中,如图8-2所示。 (3)选择【Show directories for】下拉列表框中的【Library files】项,将Python安装目录下的LIBS目录添加到【Directories】列表中,如图8-3所示。 (4)单击【OK】按钮完成操作。 如果使用Visual Studio 2005,则设置过程如下所示。 (1)单击【工具】|【选项】命令,弹出如图8-4 所示的对话框。 (2)双击左侧列表树中的【项目和解决方案】项,选 择【VC++目录】项,如图8-5所示。 (3)选择【显示以下内容的目录】下拉列表框中的 【包含文件】项,将Python安装目录下的include目录添加到列表中,如图8-6所示。
图8-1 Options对话框 图8-2 添加头文件
图8-3 添加库文件 图8-4 选项对话框
图8-5 设置VC++目录 图8-6 添加头文件 (4)选择【显示以下内容的目录】下拉列表框中的 【库文件】项,将Python安装目录下的libs目录添加到列表中,如图8-7所示。 (5)单击【确定】按钮完成操作。
图8-7 添加库文件 2.创建工程在Visual C++ 6.0中创建Python扩展过程如下所示。 (1)单击【File】|【New】命令,弹出创建 工程对话框。单击【Projects】标签,选择左侧列表中的【Win32 Dynamic-Link Library】项,在【Project name】文本框中输入工程名“myext”,如图8-8所示。 (2)单击【OK】按钮,弹出如图8-9所示的工程 设置对话框。选中【An empty DLL project.】单选框。
图8-8 创建工程对话框 图8-9 工程设置对话框 (3)单击【Finish】按钮弹出如图8-10所 示的确认对话框。单击【OK】按钮完成工程创建。 (4)单击【File】|【New】命令弹出创建文 件对话框,单击【Files】标签。选择左侧列表中的【C++ Source File】项,在【File】文本框中输入文件名“myext.c”,如图8-11所示。
图8-10 确认对话框 图8-11 添加文件 (5)单击【OK】按钮,在“myext.c”中添 加如下内容。 #include <python.h> #include <windows.h> 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); } static PyMethodDef myextMethods[] = { {"show", show, METH_VARARGS,"show a messagebox"}, {NULL,NULL} }; PyMODINIT_FUNC initmyext() { PyObject *mod; mod = Py_InitModule("myext",myextMethods); } (6)单击【Project】| 【Settings】命令,弹出如图8-12所示的工程设置对话框。 (7)选择【Settings For】下拉列表框中的【Win32 Release】项。单击【Link】标签,将【Outpub file name】文本框中的“Release/myext.dll”改为“Release/myext.pyd”,如图8-13所示。
图8-12 工程设置对话框 图8-13 设置Link选项 (8)单击【C/C++】标签,选择 【Category】下拉列表框中的【Code Generation】项,选择【Use run-time library】下拉列表框中的【Multithreaded DLL】项,如图8-14所示。 (9)单击【OK】按钮完成工程设置。 (10)单击【Build】|【Batch Build】命令,弹出如图8-15所示的对话框,将【myext-Win32 Debug】单选框前的勾去掉。单击【Build】按钮生成Python扩展。
图8-14 设置C/C++选项 图8-15 编译工程 编译完成后将在工程目录下的Release目录中生 成“myext.pyd”文件,其为所编写的Python扩展。编写“usemyext.py”调用“myext.pyd”中的函数。代码如下所示。 # -*- coding:utf-8 -*- # file: usemyext.py # import myext # 导入myext模块 print myext.show(0, 'Extend Python', 'Python') # 调用show函数 脚本运行后如图8-16所示。 由于Python官方的安装程序中不包含debug 版的库文件,不能生成debug版的Python扩展,因此上述设置都是针对release版。如果需要生成debug版的Python扩展,则需要自己 编译Python生成debug版的库文件。另外,使用Visual Studio 2005编译Python扩展与上述过程类似,这里不再赘述。
图8-16 使用Python扩展 |
征服Python:语言基础与典型应用 --Python扩展和嵌入
征服Python:语言基础与典型应用 --Python扩展和嵌入
2008-01-29 16:38