征服Python:语言基础与典型应用

用C++扩展Python的功能(一) 一. 说明 1. 例如我们可以用Python写一个功能包(包里就只有一个py文件, py文件就只有一个函数, 例如HYAdd(a, b)), 因为是同一种语言, 所以很简单. 2. 现在相当于使用C++实现一遍, 但是C++和Python是异构语言, 所以C++需要按照Python的扩展框架, 实现其规定的接口从而扩展Python的功能. 3. 在Windows下, 载体肯定 阅读详情
 
征服Python:语言基础与典型应用 --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

双精度型

8.1.3 在Python扩展中使用MFC

在Windows下使用MFC可以方便地进行GUI编程。MFC对基本的SDK API函数进行了封装,使用更为简便。在PythonWin中提供了部分MFC中的函数。在Python扩展中使用MFC与上一节中的例子有不同的地方。此处给出一个在Python扩展中使用MFC创建一个对话框的例子。整个过程如下所示。

(1)单击【File】|【New】命令,弹出创建工程对话框。单击【Projects】标签,选择左侧列表中的【MFC AppWizard (dll)】项,在【Project name】文本框中输入工程名“UseMFC”,如图8-17所示。

(2)单击【OK】按钮,弹出如图8-18所示的工程设置对话框。选中【Regular DLL using shared MFC DLL】单选框,使用动态链接方式。该方式需要MFC DLL的支持,如果选中【Regular DLL with MFC statically linked】单选框,则使用静态链接的方式,这样会增大生成的Python扩展的体积。

   

           图8-17 创建工程对话框                         图8-18 设置工程类型对话框

(3)单击【Finish】按钮,弹出如图8-19所示的确认对话框。单击【OK】按钮完成工程创建。

(4)单击【Insert】|【Resource】命令,弹出添加资源对话框,选择左侧列表中的【Dialog】项,如图8-20所示。

   

        图8-19 工程信息确认对话框                           图8-20 添加资源对话框

(5)单击【New】按钮将在工程中新建一个对话框。向对话框中添加Edit控件和Static Text控件,将其修改为如图8-21所示的形式。

(6)在创建的对话框上右击,选择【ClassWizard】命令,弹出如图8-22所示的添加类对话框。

   

             图8-21 创建对话框                          图8-22 为对话框添加类

(7)单击【OK】按钮为对话框添加一个新类,在弹出的添加类对话框中的【Name】文本框中将类命名为“CInput”,其余按照默认选项,如图8-23所示。

(8)右击创建的对话框,选择【ClassWizard】命令,弹出如图8-24所示的对话框。

(9)单击【Member Variables】标签,选中【IDC_EDIT1】项,单击【Add Variable】按钮,弹出如图8-25所示的对话框。

   

              图8-23 输入类名                              图8-24 MFC类向导对话框

(10)在【Member variable name】文本框中输入“m_input”为控件IDC_EDIT1添加变量,即获取文本框中输入的字符串,如图8-26所示。单击【OK】按钮,完成添加变量。

图8-25 添加变量对话框

(11)打开UseMFC.cpp文件,将如下文件添加到其中。

#include "Input.h"

#include <Python.h>

然后将如下所示代码添加到UseMFC.cpp文件中。

PyObject *show(PyObject *self, PyObject *args)

{

    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    CInput dia;

    dia.DoModal();

    return Py_BuildValue("s", dia.m_input);

}

static PyMethodDef UseMFCMethods[] =

{

    {"show", show, METH_VARARGS,"show a messagebox"},

   {NULL,NULL}

};

extern "C" void initUseMFC()

{

    PyObject *mod;

    mod = Py_InitModule("UseMFC",UseMFCMethods);

}

(12)打开UseMFC.def文件,将初始化函数添加到UseMFC.def文件中。def文件是用来告诉链接器DLL文件的导出函数的,相当于使用PyMODINIT_FUNC声明初始化函数。UseMFC.def文件内容如下所示。

; UseMFC.def : Declares the module parameters for the DLL.

LIBRARY      "UseMFC"

DESCRIPTION 'UseMFC Windows Dynamic Link Library'

EXPORTS

    ; Explicit exports can go here

    initUseMFC

(13)按照8.1.1节中创建工程的第(6)~(10)步操作,完成Python扩展的编译。

(14)编写如下所示的UseMFC.py,调用编译好的UseMFC模块。

# -*- coding:utf-8 -*-

# file: UseMFC.py

#

import UseMFC                   # 导入UseMFC模块

input = UseMFC.show()           # 调用show函数

print '刚才输入的是:'

print input

(15)运行脚本后,在文本框中输入“Hi,Python and MFC!”,如图8-27所示。单击【OK】按钮后,如图8-28所示。

   

             图8-26 设置变量名                        图8-27 脚本运行弹出对话框

图8-28 脚本获得文本框中的文本

征服Python--语言基础与典型应用 以及光盘 征服Python--语言基础与典型应用 以及征服Python--语言基础与典型应用随书光盘 立即下载

相关推荐

[征服PYTHON:语言基础与典型应用] 高清PDF

[征服PYTHON:语言基础与典型应用] 第一章 PYTHON语言基础 第二章 PYTHON 应用

Python的C扩展-学习总结

1. Python的C扩展 其实只要你懂得C语言编程,给Python添加新的内置(build-in)模块将十分容易。这些扩展(extension)模块可以实现两种无法直接在Python中进行的操作:他们可以实现新的内置对象类型,以及可以调用C语言的库函数和进行系统调用。 为了支持扩展,Python API定义了一个函数(functions)、宏命(macros)令和变量(variables)的...

随意的风的专栏 3229

Python-CUP基础库是百度开源的Python语言基础库

CUP 基础库是百度开源的 Python 语言基础库,致力将 DEV 从涉及底层操作、Util 操作类解放出来,使其更关注构建 service 上层业务逻辑。目前已涵盖了构建一个服务的各个方面。

Hello Python(十七)——Python扩展模块开发

一、Python扩展模块 1、Python扩展模块简介 Python与C/C++交互的方案有多种,如Python C API,SWIG,SIP,ctypes,cpython,cffi,boost.python等。 Python只是一个语言规范,有很多具体实现,CPython是标准Python,由C编写,Python脚本被编译成CPython字节码,然后由虚拟机解释执行,垃圾回收使用引用计数,Python与C/C++混合编程本质是基于CPython解释器。其它的Python实现包括Jython、Iron

天山老妖 3429

征服PYTHON--语言基础与典型应用光盘.zip

NULL 博文链接:https://dragonlin06.iteye.com/blog/659200

征服Python--语言基础与典型应用

语言基础与典型应用 认知学习Python的好教材

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

征服Python:语言基础与典型应用 --Python扩展和嵌入2008-01-29 16:38<br /> 由于Python是解释性的脚本语言,执行速度较慢。在某些需要提高脚本执行效率的情况下,可以考虑扩展Python,用C/C++来完成对效率要求高的 部分。另外,由于Python功能强大,完全可以将其嵌入到C/C++中,以简化程序,减少代码。8.1 扩展Python<br />Python提供了支持C/C++接口,可以方便地 使用C/C++来扩展Python。用C/C++编写的Pytho

yavobo的专栏 1715

智能汽车竞赛摄像头处理(4)——摄像头循迹思路讲解

智能汽车竞赛摄像头处理(4)对摄像头循迹思路进行讲解。

weixin_62261692的博客 7061

python语言基础与应用9_《征服PYTHON》语言基础与典型应用.pdf

全书内容包括Python安装、开发工具简介、Python基本语法、系统应用、GUI编程、数据库和网络编程、数据结构与算法、多媒体编程、图片处理等。[General Information]书名=征服PYTHON:语言基础与典型应用作者=孙广磊编著页数=476出版社=北京市:人民邮电出版社出版日期=2007.09SS号DX号=000006275292URL=/bookDetail.jsp?dxNum...

weixin_35379749的博客 185

Verilog流水线CPU设计(超详细)

快把这一篇给更了

Ace Cheney的博客 7万+

机械臂视觉抓取避坑指南:如何正确计算手眼标定矩阵(附Numpy代码)

本文详细解析了机械臂视觉抓取中手眼标定矩阵的计算方法,特别针对'眼在手上'配置下的常见错误提供了解决方案。通过Numpy代码示例和坐标转换原理,帮助开发者避免矩阵计算错误和坐标转换偏差,提升工业自动化系统的精度和效率。

weixin_29081703的博客 243

征服Python—语言基础与典型应用

书名: 征服Python—语言基础与典型应用 出版社: 人民邮电出版社 作者: 孙广磊 出版日期: 2007年9月 版次: 第1版 ISBN:

skyremember的专栏 1073

《广告核心指标驱动的AI投放系统:从数据洞察到智能决策的全链路优化》

本方案通过构建广告核心指标驱动的AI投放系统,实现从数据采集到智能决策的全链路自动化。

专注Java领域与微服务架构,热爱人工智能与深度学习 1069

Python脚本文件中使用中文

Python做图形用户界面(GUI)开发时经常要在界面上显示中文,需要做如下处理(详见[1]和[2]2.3节): 在py文件的首行写上:# -- coding:utf-8 -- 保存py文件时要存为utf-8格式文件。 [1] Python2.6 Documentation: The Python Language Reference: 2.1.4 Encoding declarati...

weixin_30706507的博客 271

解锁RK3588芯片超强网络性能:多队列网卡与IRQ负载均衡实战

摘要:本文针对RK3588芯片的网络性能优化展开研究,重点探讨了多队列网卡配置和IRQ负载均衡技术。通过配置多队列网卡,将网络流量分散到多个队列处理,显著提升了吞吐量(测试显示提升67%)。同时,通过IRQ负载均衡配置使中断请求均匀分配到各CPU核心,CPU利用率降低至35%。文章详细介绍了配置步骤、测试方法,并分析了常见问题及解决方案。这些优化措施有效提升了RK3588在网络录像机、边缘计算等应用场景中的性能表现,为高性能网络应用提供了有力支持。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 500

【DRAM存储器五十七】LPDDR5介绍--read DQ training和WCK DQ training

简述LPDDR5训练中的读写DQ训练

highman110的博客 523

《征服python中文版》资源下载介绍

《征服python中文版》资源下载介绍 去发现同类优质开源项目:https://gitcode.com/ 《征服python中文版》是一本专为中文读者编写的Python编程语言教科书。全书以通俗易懂的语言,系统讲解了Python编程的基础知识、高级特性及实际应用。本书以pdf格式呈现,方便读者随时随地学习。 本书特色: 系统性:从Python基础语法开始,逐步深入,涵盖Python编程的各个方面...

gitblog_06746的博客 404

Unreal5从入门到精通之EnhancedInput增强输入系统详解

从Unreal5开始,老版的输入系统,正式替换为EnhancedInput增强型输入系统,他们之间有什么区别呢?如果有使用过Unity的同学,大概也知道,Unity也在2020版本之后逐渐把输入系统也升级成了新版输入系统,为什么Unreal和Unity都热衷于升级输入系统呢?这之间又有什么联系呢?官方:增强输入EnhancedInput希望这篇文章能够对你有所帮助。

TxNet 945

python入门电子书免费下载,python电子教材免费下载

搜集整理的100份python教材,有需要的小伙伴可以根据目前所做的项目需要选择合适的文档即可,文档比较多,教材比较多,初级,中级,高级都有,大家慢慢选吧。Python编程:从入门到实践(#).pdfPython100经典练习题.pdf。轻量级DjangoJulia_Elman.pdf流畅的python.pdf。Python编程快速上手—让繁琐工作自动化_PDF中文高清晰完整版.pdf。Python入门经典_以解决计算问题为导向的Python编程.pdf。

pingf123的博客 974

Qt之自定义QToolTip,去掉显示动画和隐藏延时

先来看看Qt原生QToolTip的缺点:1.当提示内容无变化时,弹窗无法移动。只能先传个空字符串强制弹窗隐藏,然后在新位置再传个字符串。2.默认显示10多秒才消失,当然这个时间是可以设置的,但是如果我想一直显示呢?总不能设置一个超级大的时间吧。3.鼠标移出控件后(调用QToolTip::showText时传入了控件指针)默认300毫秒弹窗才隐藏。而且这个时间没法设置,如果想立即隐藏就没办法了。

草上爬的博客 4269

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

儿童编程软件python征服_征服 python

广告关闭腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!ftp.storbinaly(stor filename.txt,file_handel,bufsize) #上传目标文件ps:以下代码来自《征服python-语言基础于典型应用》import stringfrom ftplib importftp # 从ftplib模块中导入ftp...

weixin_39884832的博客 377

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

自动扫雷:运用Python征服Windows经典扫雷游戏

自动扫雷:运用Python征服Windows经典扫雷游戏 项目介绍 自动扫雷(Automatic-minesweeping) 是一个旨在自动化玩转Windows XP经典版本扫雷游戏的开源项目。该项目由Python 3.7驱动,利用编程智能应对扫雷中的逻辑挑战。开发者通过结合numpy进行高效矩阵运算,Pillow库用于截取游戏画面分析,以及pywin32来实现对游戏窗口的操作,如模拟鼠标点击和键...

gitblog_00726的博客 578

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

python 书籍推荐 三

主要先学习《python语言入门》学完后,研究《征服python》Python简明教程(A Byte of Python) 此书讲解简洁易懂,适合初学者 剖析Python源代码 此书是国内出的一本较好的Python书籍,从Python解释器角度来分析Python的行为  《python学习手册》第三版 《Python核心编程》   PyDev for Eclipse 布同:如何循序渐进...

weixin_33871366的博客 501

【Rust征服Python生态】:5个关键指标揭示扩展模块性能真相

深入解析Python与Rust扩展模块的性能对比,揭示5大关键指标下的真实表现。涵盖高并发、内存安全、执行效率等场景,对比原生Cython与Rust实现方法,突出Rust在性能与安全性上的双重优势,为Python生态扩展提供新思路,值得收藏。

LearnPlex的博客 843

R语言基础语法与数据处理实战指南

R语言作为统计计算领域的经典工具,其向量化运算特性与原生数据结构设计使其在数据处理领域独具优势。通过内置的data.frame等数据结构,R能够高效完成数据清洗、转换等操作,而无需依赖第三方库。在数据科学工作流中,掌握R语言基础语法是进行统计分析、机器学习建模的前提条件。本文以实际气象数据处理场景为例,详解R语言的环境配置、语法结构、向量化运算等核心概念,并演示如何使用dplyr等工具包完成数据筛选、分组聚合等典型操作。针对数据分析师常见的数据透视、缺失值处理等需求,提供了可直接复用的代码示例。最后通过学生

weixin_30780649的博客 492

PyLink完全解析:用Python彻底征服J-Link嵌入式开发

PyLink是专为SEGGER J-Link设备量身打造的Python开发接口,让嵌入式工程师能够在熟悉的Python环境中完成设备调试、固件烧录和系统监控等复杂任务。通过将J-Link的强大功能与Python的简洁语法完美融合,PyLink为嵌入式开发带来了革命性的效率提升。 ## 🎯 PyLink的核心价值:为什么选择它? **简化开发流程**:告别繁琐的命令行操作,用Python代码直

gitblog_00220的博客 1127
上一篇: Open Libraries Orge
下一篇: 在C/C++中嵌入Python
XRZEngine
博客等级 码龄18年 0粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值