今天凌晨写了一篇决定弃用PyQt5的文章,但是最终还是含着眼泪说出真香两个字。
主要是在研究如何在基于c++的QT中调用python程序时,发现了一个问题:变量的传递。还不知道如何解决,但是我感觉一定很麻烦。变量少一点还好,分别将二者的输入输出重定向至同一个文件(或是一个内存地址处?),然后读取这个文件就行了。但变量很多时怎么办?想不明白。
最后又读了一下《PyQt5快速开发与实战电子书》,特别是看了下书中的pyqt5和pyqt5-tools的版本,尝试着解决一下。
上一篇文章提到了打包过程中各种乱七八糟的坑,下面就说说我是怎么解决的吧。
首先,保证环境的干净,建议安装win10虚拟机(win7的虚拟机要安装python需要先更新系统,刚装好的虚拟机太过纯净,缺少几个重要的win7系统更新),然后只安装Python3.7,注意x86还是x64
然后安装PyQt5 5.9和pyqt5-tools 5.9.2.1.3
pip install PyQt5==5.9 -i https://pypi.douban.com/simple
pip install PyQt5-tools==5.9.2.1.3 -i https://pypi.douban.com/simple
然后pip安装pyinstaller,我安装的是最新版3.5
然后cmd进入目录下,对入口程序gui.py使用
pyinstller -F -w gui.py
-w是生成程序窗口而不是cmd黑框,-F是形成一个exe文件而不是一大堆的文件
然后在目录下生成了文件夹build、dist和文件***.spec,打开dist文件夹,发现了exe程序,可以单独使用,而不依赖与build文件夹内的那些文件。
不过需要注意的是,64位python下打包生成的exe文件仅能在64位机子下使用。如果有32位的需求,可以安装32位python,然后打包(32位程序可以以兼容的模式在64位机子下运行)
不过还是有点大,我再精简一下导入的包
2019.10.20
最近一直在写typecho的微型客户端,今天刚收尾。
文本框掩码在PyQt5==5.9的bug
在这里说一下文本框掩码的bug。本机win10 X64 & PyQt5==5.11.3下无bug,但是当在win10 x86 & PyQt5==5.9下出现问题了(打包之前就有问题了,而不是打包的锅)。
bug具体为:输入数据遇到分隔符时,光标在分隔符上,但是此时输入一个字符却显示在分隔符的下一位处。这不是bug,bug在于紧接着,光标移动一位,到达分隔符的下一处,但是此处已经在上一步中输入了一个字符,此时光标在此处,再次输入数据会覆盖刚刚输入的数据。
首先怀疑x86和x64平台不同的缘故,但是本机更换为PyQt5==5.9后也出现了同样的问题,说明是PyQt5==5.9的bug。
然后虚拟机PyQt5==5.11.3,bug得到修复。
(PyQt5-tools==5.9.2.1.3不变)
PyQt5==5.11.3时的打包
然后打包时出现了好几个warning,但是最终还是打包成功了,似乎没影响。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| PS C:\Users\kljxn\Desktop\typecho_desktop> pyinstaller -i typecho.ico -F -w main.py 108 INFO: PyInstaller: 3.5 108 INFO: Python: 3.7.5 108 INFO: Platform: Windows-10-10.0.17763-SP0 108 INFO: wrote C:\Users\kljxn\Desktop\typecho_desktop\main.spec 108 INFO: UPX is not available. 108 INFO: Extending PYTHONPATH with paths ['C:\\Users\\kljxn\\Desktop\\typecho_desktop', 'C:\\Users\\kljxn\\Desktop\\typecho_desktop'] 108 INFO: checking Analysis 108 INFO: Building Analysis because Analysis-00.toc is non existent 108 INFO: Initializing module dependency graph... 108 INFO: Initializing module graph hooks... 108 INFO: Analyzing base_library.zip ... 4734 INFO: running Analysis Analysis-00.toc 4734 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable required by c:\users\kljxn\appdata\local\programs\python\python37-32\python.exe 5327 INFO: Caching module hooks... 5343 INFO: Analyzing C:\Users\kljxn\Desktop\typecho_desktop\main.py 5687 INFO: Processing pre-safe import module hook urllib3.packages.six.moves 8125 INFO: Loading module hooks... 8125 INFO: Loading module hook "hook-certifi.py"... 8125 INFO: Loading module hook "hook-encodings.py"... 8233 INFO: Loading module hook "hook-pydoc.py"... 8233 INFO: Loading module hook "hook-PyQt5.py"... 8421 INFO: Loading module hook "hook-PyQt5.QtCore.py"... 8874 INFO: Loading module hook "hook-PyQt5.QtGui.py"... 9546 INFO: Loading module hook "hook-PyQt5.QtWidgets.py"... 10499 INFO: Loading module hook "hook-xml.py"... 10640 INFO: Looking for ctypes DLLs 10640 INFO: Analyzing run-time hooks ... 10640 INFO: Including run-time hook 'pyi_rth_pyqt5.py' 10640 INFO: Including run-time hook 'pyi_rth_certifi.py' 10656 INFO: Looking for dynamic libraries 16874 INFO: Looking for eggs 16874 INFO: Using Python library c:\users\kljxn\appdata\local\programs\python\python37-32\python37.dll 16874 INFO: Found binding redirects: [] 16890 INFO: Warnings written to C:\Users\kljxn\Desktop\typecho_desktop\build\main\warn-main.txt 16999 INFO: Graph cross-reference written to C:\Users\kljxn\Desktop\typecho_desktop\build\main\xref-main.html 17015 INFO: checking PYZ 17015 INFO: Building PYZ because PYZ-00.toc is non existent 17015 INFO: Building PYZ (ZlibArchive) C:\Users\kljxn\Desktop\typecho_desktop\build\main\PYZ-00.pyz 17890 INFO: Building PYZ (ZlibArchive) C:\Users\kljxn\Desktop\typecho_desktop\build\main\PYZ-00.pyz completed successfully. 17921 INFO: checking PKG 17921 INFO: Building PKG because PKG-00.toc is non existent 17921 INFO: Building PKG (CArchive) PKG-00.pkg 18296 WARNING: One binary added with two internal names. 18312 WARNING: ('libGLESv2.dll', 'C:\\users\\kljxn\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\PyQt5\\Qt\\bin\\libGLESv2.dll', 'BINARY') 18312 WARNING: was placed previously at 18312 WARNING: ('PyQt5\\Qt\\bin\\libGLESv2.dll', 'C:\\users\\kljxn\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\PyQt5\\Qt\\bin\\libGLESv2.dll', 'BINARY') 27015 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully. 27015 INFO: Bootloader c:\users\kljxn\appdata\local\programs\python\python37-32\lib\site-packages\PyInstaller\bootloader\Windows-32bit\runw.exe 27015 INFO: checking EXE 27015 INFO: Building EXE because EXE-00.toc is non existent 27015 INFO: Building EXE from EXE-00.toc 27030 INFO: Copying icons from ['typecho.ico'] 27030 INFO: Writing RT_GROUP_ICON 0 resource with 20 bytes 27030 INFO: Writing RT_ICON 1 resource with 67624 bytes 27030 INFO: Updating manifest in C:\Users\kljxn\AppData\Local\Temp\tmpxz_9ammu 27030 INFO: Updating resource type 24 name 1 language 0 27046 INFO: Appending archive to EXE C:\Users\kljxn\Desktop\typecho_desktop\dist\main.exe 27187 INFO: Building EXE from EXE-00.toc completed successfully.
|
需要说明的是,在修复文本框掩码的bug之前(即PyQt5==5.9时),打包时也出现了一个warning,但是同样也没影响打包结果。
failed to execute script main
之前写校园网登录器的时候最烦这个东西,当时以为是打包出的错。
但是,今天多次尝试,终于明白这是个什么东西了。
翻译:执行脚本main失败
明白了吧。只要是主程序出错,都会弹出这个窗口。
并不是打包的锅哦。
今天遇到多次此对话框,出现的错误原因有:
- json读取出错。在win10 x86的虚拟机中,每当修改配置文件时,都会自动加上BOM头。导致
上面的报错是我运行main.py的结果。打包后看不到这些错误信息,只能看到 failed to execute script main
,不头大才怪嘞。
总之,以后再出现这个对话框,不妨再测试测试程序,而不要再怪罪pyinstaller了。
PyQt-sip问题
提示缺少这个东西,我就安装了,具体不清楚不安装有什么后果。留待以后再探讨吧。
今天的环境
成果