征服Python:语言基础与典型应用 --Python扩展和嵌入

来源:互联网 发布:c语言玫瑰花束编程 编辑:程序博客网 时间:2024/05/29 19:17
征服Python:语言基础与典型应用 --Python扩展和嵌入
2008-01-29 16:38

由于Python是解释性的脚本语言,执行速度较慢。在某些需要提高脚本执行效率的情况下,可以考虑扩展Python,用C/C++来完成对效率要求高的部分。另外,由于Python功能强大,完全可以将其嵌入到C/C++中,以简化程序,减少代码。

8.1 扩展Python

Python提供了支持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扩展

原创粉丝点击