• 6448阅读
  • 5回复

Qt5下Sip封装C++给Python使用的方法教程 [复制链接]

上一主题 下一主题
离线yanche
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2018-09-29
回复本帖可获得1RMB金钱奖励!
每人最多可获奖1次,奖池剩余29RMB金钱 (中奖几率10%)
本文将带领大家详细讲解Qt下怎么利用sip将Qt的库封装为Python可以使用的pyd格式的库

特别注意事项:
A
Sip的包使用的版本是4.18Python使用的3.5.0版本,PyQt使用的是PyQt5.6,基本这三个就够用了,sip这个工具一定要小心,和版本关系很大,如果用错了,将会导致很多复杂的问题出现,本人编辑器的改进方案时候,由于需要对旧版本编辑器兼容,所以,我需要编译出来,并且将其从Qt4.8.6迁移到Qt5.6.1下,同时还需要使用SIP重新打包DGCore这个工程,以便生成对应版本的pyd文件,过程之艰辛,把我折腾了一个半死
B.
1.如果你的脚本是放在一个文件夹下面的,请不要在Python3.5中这样导入模块:import 文件夹名称.脚本名称
如果这样导入,python执行的时候是会报错的,但是在Python2X版本中不会报错,请注意这个要点。请使用这样的方式导入模块:
import 脚本文件名称
PyRun_SimpleString执行一下就行了
2.在Python3.5中,请在程序中动态的将你的脚本文件所在的目录添加到系统的环境变量中去,使用如下代码:
QString _scriptPathtest = QFileInfo(sname).absolutePath() + "/ScreenScript/test";
_scriptPathtest = QString("sys.path.append('%1')").arg(_scriptPathtest);
PyRun_SimpleString(_scriptPathtest.toStdString().c_str());
C.
另外就是,使用这个版本编译pyd的时候,需要在sip.h文件中增加下面的代码,见下图所示:
[attachment=19545]



切记,只有这样,才可以保证你的sip.h文件能够用于编译Qt5.6版本的程序,尤其是当一个类从QObject继承来的。


简介:
Sip 是为Python生成C++接口代码的工具,它与SWIG类似,但使用不同的接口格式。其思想起源于SWIG,主要是为将QT封装为Python创造,它用作创建PyQt和PyKDE,并支持 Qt signal/slot 系统。
概述:
主要介绍在Window平台下,SIP的编译、安装,以及将C++代码生成为Python
步骤:
在开始之前,最好先确认下自己有没有Python的编程经验或者C++的编程经验,至少你需要会一点吧,要是两个都不会的话,建议自己主动Go to hell,去找本书自己看看吧,过后再来,好吧。
1.下载对应的Python安装包、Sip库、PyQt安装包
Python3.5.0、sip4.18、PyQt5.6(这三个可是有版本对应关系的,我一开始没注意这个,结果被sip给坑惨了,从4.12一致尝试到4.19,他妹的
当然在之前你需要首先安装VS2013和Qt5.6.1,不然下面很难搞。

2.先安装Python,最好安装在C盘根目录下,且目录名称不要带有空格,同时配置好环境变量等,本文以Python3.5为例进行说明。
3.解压Sip库到指定的目录位置,比如D盘。本文以Sip4.18版本为例进行说明。
4.解压 PyQt5.6的源代码到指定目录,比如D
编译PyQt5.6步骤:
A进入PyQt5.6的源代码目录包,执行如下命令:
然后在执行如下命令:
python configure.py --sip=C:/Python35/sip.exe --sip-incdir=C:/Python35/include
B之后会提示让你选择一个命令字符,此时直接输入yes,然后回车就行了,接着就是等待等待,哈哈。
这一步可能会有人出现错误提示,那最大的原因就是你的Python版本或者sip版本与当前的PyQt的版本不一致导致的(不信你可以试试,错误虐死你,这是会智商碾压的,哈哈)
C.等待下一步提示出现后,然后输入:nmake
这一步就需要你耐心的等待了,时间的确很长。不过这一步也会出现错误的,就是提示某一个模块无法编译通过。最好的解决办法如下图所示:[attachment=19546]
特别说明:一般这个过程出错的模块基本上你是用不到的一些不常见的模块,所以采用了上面的解决办法。是不是有点太不人性化了啊。呵呵。

D.nmake执行完之后,紧接着在命令行输入nmake install
这个过程很快的,估计两三分钟就搞定了,我的是不到两分钟。
当这一步执行完之后,PyQt5的自行编译就已经彻底OK了。
是不是有点小兴奋,别急,继续来,Go On……
5. 打开Windowscmd命令行,进入SIP根目录,输入如下命令:
python configure.py --show-platform查看当前Sip支持的平台,如下图所示:[attachment=19547]

在这个过程中,很有可能出现你的编译平台并不在Sip所支撑的列表中,此时应该怎么办呢?请看解决此问题的葵花宝典:
首先,进入你所解压的sip目录,然后进入specs这个目录,查看其中的文件,如下图所示:[attachment=19548]
根据自己的平台是windows还是linux来决定下一步具体修改那个文件,本文以我的电脑为例(windows平台,我是微软的忠实客户)。
选择其中的任意一个win32-msvc的文件,然后复制一份,将新复制的文件进行重命名,名称为你的编译器名称,比如:win32-msvc2013.

然后用文本编辑工具打开这个新命名的文件,如下图所示:[attachment=19549]
请格外注意这个文件中标注红色的地方,第一个红色地方说明了你的编译器版本号是多少,此时你就可以修改这个号码为你的目标编译器的平台号即可。第二个红色地方代表当前你的编译器平台所对应的QtQMAKE_CFLAGS的配置项,请不要填写错误,否则后面编译会出错,而且这些错误几乎找不到答案,所以,亲们还是按我说的,好好弄,乖。
回到SIP根目录,找到下图所示文件并打开:

按照上图中红色方框内的标注和右边的文字要求,更改这个脚本文件的代码即可。
到这一步骤结束的时候,OK,你的SIP已经可以支持你的编译器平台了,是不是很开心啊,别高兴的太早,继续听我娓娓道来。
然后打开VS对应的命令提示工具(建议使用:Developer Command Prompt for VS2013,即开发者命令提示工具模式)来依次执行如下三条指令:

Apython configure.py --platform win32-msvc2015
这个语句主要用来生成sipMakeFile文件
Bnmake
编译对应的Sip库文件,主要用来生成sip.hsip.pyd等文件
Cnmake install
执行安装指令,将sip生成的东西安装到你的Python目录中
OK,到了这里,基本上Sip的编译和安装,以及平台配置都已经基本完成了。
接下来就需要我们进入最有难度的环节了,这个环节你们可要好好听啊,不然可就前功尽弃了

(题外话:当时我研究的时候,绞尽脑汁,头疼死了,为此,嘴上火好几天了,起的满嘴角的水泡,晚上搞到很晚,几乎都是翻看sip官方提供的文档,要知道那可是纯英文的,对于哥这样考了四级的人还是有点难度的,呵呵,当年面试的时候可是带着四级证书来的),首先创建一个dll工程,包含一个头文件和实现文件,如下图所示:[attachment=19551]

紧接着我们可以来编写Sip文件和configure.py文件了,关于怎么编写这个文件,sip的官方文档可是有介绍的,想查阅的同学自己去翻看吧,反正我当时看到吐(英文不好的话,估计就惨了)。[attachment=19552]
需要注意的是其中的%Module%TypeHeadCode这个宏,其实你们自己写这个sip文件的时候,就模仿sip的官方样例就行了,呵呵。我给你看下我自己工程中的sip是怎么写的,看好了,如下图所示:
[attachment=19553]
这个可是完整的sip文件的书写样例,一点都不含糊的,大家可以尽情参考我的这个样例来书写自己的sip文件。
紧接着说一下configure.py文件的编写,下图是sip官方提供的样例,基本上已经非常全面了,不多说,直接上图:

这个文件就是需要留存在你的工程中去的,也就是你想要导出给Python使用的那个工程中使用的。(依赖原DLL的使用Sip进行Python封装的那个工程)
然后,请注意下图:


这个图也就是使用Sip进行封装的那个工程,里面所指定的文件,比如config.pyxxxxCore.sbf以及sipXXXX.cpp文件,这些都是自动生成的,人为是干涉不了这些文件的,下面说一下怎么自动生成这个文件。
在刚刚的那个命令行模式下,切换目录到你自己需要使用sip进行封装的那个工程中去,然后执行下面的命令:
python configure.py
然后回车,之后如果你的sip文件写的没有问题的话,那基本上就会一路绿灯向下,生成对应的上图所示的文件(记住,千万不要闯红灯哦,对了红灯区也不要随便去哦)

当然,在执行这个命令的过程中,很多人会出现一些意外的错误问题或提示:
1.提示:sip: QGraphicsItemGroup has not been defined
原因及解决办法:
提示这个出来是因为你的当前sip文件中所使用的Import模块所导入的模块中不包含这个模块,才导致了这个问题的出现,请检查sip文件中使用了QGraphicsItemGroupsip文件,然后只用%Import 命令导入对应的系统sip文件即可。,比如:
%Import QtWidgets/QtWidgetsmod.sip
就解决了上面的这个问题,因为是Qt5,所示需要导入这个库才行
2.提示:sip5 version number is ingrone

原因及解决办法:说明你的sip使用的Qt版本和目标是不一致的,即你的版本太低,此时只需要打开sip文件,按照提示信息中指明的第5行,找到这个内容,然后将版本更改为你正在使用的版本即可,如下如所示:
紧着就是你需要通过VS自己编译自己的pyd工程了,祝你编译顺利哦。
这样,整个教程就解说完毕了,不知道大家有没有听懂,如果不懂的也可以在私信给我,我将会给你提供实时的帮助哦。
邮箱:[email=548725431@qq.com]ycloco001@126.com[/email]
微信公众号如下:



具有十年研发经验的团队,专注于C++、Qt、Python等语言,专业软件开发团队,致力于完美解决客户的需求,我们期待与您的洽谈。
业务范畴:应用软件定制、UI定制、各类管理系统定制、仿真设计、三维开发、通信SDK定制、Logo设计等等
QQ:548725431
微信:yanche521
离线yanche

只看该作者 1楼 发表于: 2018-09-29
在写文章的时候,有图片张数的限制,可能部分图没有完整的传上来,大家有啥问题,可以直接提出来
具有十年研发经验的团队,专注于C++、Qt、Python等语言,专业软件开发团队,致力于完美解决客户的需求,我们期待与您的洽谈。
业务范畴:应用软件定制、UI定制、各类管理系统定制、仿真设计、三维开发、通信SDK定制、Logo设计等等
QQ:548725431
微信:yanche521
在线boylebao

只看该作者 2楼 发表于: 2018-09-29
回帖奖励+ 1
不明觉历
为Qt打造具有强大生产力的软件。
离线yanche

只看该作者 3楼 发表于: 2018-09-29
回 boylebao 的帖子
boylebao:不明觉历 (2018-09-29 15:48) 

就是将Qt开发的dll封装为Python可以调用的pyd格式,其实pyd就是Python可以使用的dll,可以这么理解的
具有十年研发经验的团队,专注于C++、Qt、Python等语言,专业软件开发团队,致力于完美解决客户的需求,我们期待与您的洽谈。
业务范畴:应用软件定制、UI定制、各类管理系统定制、仿真设计、三维开发、通信SDK定制、Logo设计等等
QQ:548725431
微信:yanche521
离线qq860930595

只看该作者 4楼 发表于: 2018-09-29
呵呵,来捷安面试的时候可是带着四级证书来的。做轨道交通的捷安?
离线yanche

只看该作者 5楼 发表于: 2018-09-30
回 qq860930595 的帖子
qq860930595:呵呵,来捷安面试的时候可是带着四级证书来的。做轨道交通的捷安? (2018-09-29 17:20) 

哈哈,往事往事
具有十年研发经验的团队,专注于C++、Qt、Python等语言,专业软件开发团队,致力于完美解决客户的需求,我们期待与您的洽谈。
业务范畴:应用软件定制、UI定制、各类管理系统定制、仿真设计、三维开发、通信SDK定制、Logo设计等等
QQ:548725431
微信:yanche521
快速回复
限100 字节
 
上一个 下一个