详细教程:如何在Qt环境下使用SIP将Qt库封装为Python可用的pyd格式库
本文将带领大家详细讲解如何在Qt下使用sip将Qt库封装成Python可以使用的pyd格式库。特别说明:A、Sip包使用的版本是4.18,Python使用3.5.0版本,PyQt使用PyQt5.6。基本上这三个就够了。使用sip工具一定要小心,这和版本有很大关系。如果使用不当,会导致很多复杂的问题。我的编辑器的改进方法在做项目的时候,需要兼容老版本的编辑器,所以需要编译并从Qt4.8.6迁移到Qt5.6.1。我还需要使用SIP重新打包DGCore项目,生成对应版本的pyd。记录过程非常艰巨,差点把我累死。 B. 1. 如果你的脚本放在文件夹下,请不要像这样导入Python3.5中的模块:导入文件夹名称。如果这样导入脚本名,执行python时会报错,但在Python2X版本中不会报错,请注意这一点。请使用此方法导入模块:导入脚本文件名 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文件是正确的。 h文件可以用来编译Qt5.6版本的程序,特别是当一个类继承自QObject时。

简介:Sip是一个为Python生成C++接口代码的工具。它与 SWIG 类似,但使用不同的接口格式。这个想法起源于 SWIG,它主要是为了将 QT 封装到 Python 中而创建的。它用于创建PyQt和PyKDE,并支持Qt信号/槽系统。概述:主要介绍Window平台下SIP的编译和安装,以及将C++代码生成为Python的步骤: 在开始之前,最好先确认一下自己是否有Python编程经验或者C++编程经验。至少你要知道一点,如果你两个都不会,我建议你主动下地狱,去找这本书自己看一下,稍后再回来,好吗。 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/includeB.系统将提示您选择命令字符。这个时候输入yes然后回车就可以了。那你就等着吧,哈哈。有人可能会在这一步得到错误信息,最大的原因是你的Python版本或者sip版本与当前PyQt版本不一致(不信你可以试试,错误会杀了你,它会碾压你的智商的,哈哈) C.等待下一个提示出现,然后输入:nmake。这一步需要你耐心等待,而且确实需要很长的时间。但是这一步可能会出现错误,也就是说某个模块无法编译通过。最好的解决方案如下图所示: [attachment=19546] 特别说明:一般这个过程中导致错误的模块都是你不需要的不常见模块,所以采用上面的解决方案。是不是有点太不人道了?呵呵。 D、执行nmake后,在命令行输入nmake install。这个过程非常快。大约需要两三分钟才能完成。我的花了不到两分钟。
当这一步完成后,PyQt5的自编译就完全OK了。你是不是有点兴奋?别着急,继续,Go On... 5、打开Windows cmd命令行,进入SIP根目录,输入以下命令: python configure.py --show-platform 查看当前支持的平台Sip ,如下图: [attachment=19547] 在这个过程中,很有可能你的编译平台不在Sip支持的列表中。此时你应该做什么?解决这个问题请看向日葵指南:首先进入你解压后的sip目录,然后进入specs目录查看里面的文件,如下图: [attachment=19548]根据你的平台是windows还是linux来决定下一步是专门修改该文件。本文以我的电脑为例(windows平台,我是微软的忠实客户)。选择任意一个 win32-msvc 文件,然后进行复制,并将新复制的文件重命名为您的编译器的名称,例如:win32-msvc2013。然后用文本编辑工具打开新命名的文件,如下图: [attachment=19549] 请特别注意该文件中的红色区域。第一个红色区域表示您的编译器版本号。这个时候你可以把这个数字修改为你的目标。只是编译器的平台号。第二个红色区域代表当前对应你的编译平台的Qt的QMAKE_CFLAGS的配置项。错误请不要填写,否则后续编译会出现错误,而这些错误几乎没有答案,所以请按照我的建议。是的,做好事,做个好人。返回SIP根目录,找到如下所示的文件并打开:
只需按照上图红框内的标记和右侧的文字要求更改此脚本文件的代码即可。完成此步骤后,OK,您的 SIP 已经可以支持您的编译器平台了。你很高兴吗?别高兴得太早,继续听我说。然后打开VS对应的命令提示符工具(建议使用:Developer Command Prompt for VS2013,即开发者命令提示符工具模式)依次执行以下三个指令: A. python configure.py --platform win32-msvc2015 该语句主要用于生成sip MakeFile文件B。nmake编译对应的sip库文件,主要用于生成sip.h、sip.pyd等文件C。 nmake install 执行安装指令并将 sip 生成的东西安装到你的 Python 目录中。好的。至此,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.py、xxxxCore.sbf和sipXXXX.cpp文件,都是自动生成的。人类无法干预这些文件。下面讲一下如何自动生成这个文件。在刚才的命令行模式下,将目录切换到需要使用sip进行封装的项目,然后执行以下命令:python configure.py并回车。如果你的sip文件没有问题,那么绿灯基本上会一直亮下去,并且会生成上图所示的相应文件(记住,千万不要跑红灯)去红灯区)当然,在这个命令的执行过程中,很多人都会遇到一些意想不到的错误或者提示: 1、提示:sip: QGraphicsItemGroup has not be Defined 原因及解决方案:出现这个提示是因为导入的模块由使用的导入模块您当前的sip文件不包含此模块,从而导致此问题。请检查sip文件中使用QGraphicsItemGroup的sip。文件,然后只需使用%Import命令导入相应的系统sip文件。 ,例如:%Import QtWidgets/QtWidgetsmod.sip 解决了上述问题。因为是Qt5,所以需要导入这个库。 2、提示:sip:5版本号为Ingrone 原因及解决方案:说明你的sip使用的Qt版本与目标不一致,即你的版本太低。这时,你只需打开sip文件,按照提示信息中指定的第5行,找到此内容,然后将版本更改为你正在使用的版本即可,如下图:
接下来就是需要通过VS编译自己的pyd项目了。祝你编译顺利。至此,整个教程就已经讲解完毕。不知道你是否明白。如果有不懂的可以私信我,我会为您提供实时帮助。邮箱:ycloco001@126.com 微信公众号如下: