一直在学习新的东西,感觉当时学了!懂了!会了!但是过了就忘了!!!深刻反思后,觉得是没有总结的原因。刚好这段时间因为工作需要在学习pyqt,就把自己在使用pyinstaller对程序打包时遇到的一些问题及解决方法总结出来供大家参考,能力有限,若有不对的地方望指正。
pyinstaller命令参数
参数 | 含义 |
---|---|
-F | 将程序打包为一个可执行文件 |
-D | Py代码放在一个目录中(默认状态) |
-d | 打包后的可执行程序为debug模式(打包错误时打印错误信息) |
-w | 不生成命令行窗口 |
-n | -n softname, 制定软件名称 |
–icon | –icon=图标名,制定软件显示图标 |
-v | –version=版本文件(txt形式),增加软件版本信息 |
-upx | 使用UPX压缩可执行程序 |
打包步骤
1.安装pyinstaller,需根据实际python开发版本确定安装版本。pyinstaller兼容性不敢过多评价,不同windows版本需要分别打包。
安装命令:
pip install pyinstaller
2.安装依赖 pywin32,sip。有其他博主说pywin32不可用pip安装,但试了一下是可以的(手动鬼脸)。
安装命令:
pip install pywin32
pip install sip
3.重点来啦!!!
方式一:
打开命令行窗口,进入项目根目录;
输入命令:pyinstaller 参数 .py文件
eg. pyinstaller -Fw -n test --icon=“icon.ico” main.py (打包生只有一个文件,没有控制台,名为test,图标为icon.ico的软件)
方式二:
打开命令行窗口,进入项目根目录;
输入命令:
pyinstaller options name (生成名为name.spec的文件,spec文件记录详细的打包信息)
pyinstaller -F name.spec (生成单个文件的exe程序)
运气好的话到这里就结束了,当然大多数情况下是不可能滴!下面来讲讲我遇到的坑。、
坑
坑一
第一次尝试时没有充分理解命令参数,打包后运行程序弹出控制台窗口并闪退。
解决方法:加入-w命令参数,取消打包时弹出控制台。
坑二
点击运行打包后的程序,弹出错误信息如下:
一脸懵,不知道为啥。在正式打包前请先用-d参数打包,确保打包无误后再打包生成正常模式软件。运行debug模式的程序,在控制台得到错误信息:
没有找到模块sip
sip模块在安装pyqt5时已附带安装,但名字不同,这里不知道是不是同一个东西?
sip简介:sip是一种工具,用于为c/c++创建python绑定,其包括代码生成器和python模块,此处提供另外一篇博客的解释https://blog.csdn.net/qq_41185868/article/details/80902785
解决方法:直接使用代码引入,from PyQt5 import sip 。
坑三
再次打包,程序正常运行,界面也可以打开了,但不幸的事又发生了,错误信息:
提示exit名字错误,又是一脸懵
解决方法:修改代码,在exit()前加上模块名,sys.exit()
好啦!到这里遇到的坑解决啦,后面说说打包时可能会用到的东西。
技巧
这里的内容也是打包时遇到的,不过个人不认为是坑,所以单独列出来了。
图标替换问题
软件在不同的地方显示时需要不同的尺寸的图标,(如资源管理器里面的列表显示、桌面显示、任务栏显示等),理论上需要四张不同大小的图标合成一张。
图标大小:
具体参照:http://stackoverflow.com/questions/3236115/which-icon-sizes-should-my-windows-applications-icon-include
合成工具使用png2icon,下载链接:http://www.winterdrache.de/freeware/png2ico/
缺少动态链接库
Qt自身的运行需要依赖特定的动态链接库,在没有装过Qt和python的计算机上运行pyqt程序会提示缺少必要的dll文件。缺少的文件位置在自己安装的pyqt目录下的QT里,文件夹名字为plugins。该文件下包含四个dll文件,为Qt运行所必须滴。这里给出我的文件地址供参考:C:…\PyQt5\Qt\plugins 。找到plugins文件后,将其复制一份到打包好的exe应用程序同目录下即可。
现在又有一个问题了,boss只想要一个单一的exe文件,现在多出一个依赖文件十分碍眼,咋办呢?在查看前辈经验后给出如下解决办法,使用虚拟文件打包工具(Enigma Virtual Box)将应用程序和plugins虚拟化为一个exe程序,安装使用方法简单,不会自行百度。好啦,到此算基本完成了,手动开心。
添加版本信息
前面的一系列操作后,软件可以用啦!但是呢没有版本信息啊。
这个好办,使用pyinstaller 内置的grab_version.py 命令获取其他exe的版本文件,格式如grab_version.py :c:/…/…/name.exe。
获取到文件后复制到自己的项目根目录下,将里面的信息改写为自己的,在打包时使用“-v file=version_file_name.txt”参数将版本信息文件加入到即可。
注:文本中最后一行信息中的两个数字表明软件所属国家及语言:VarFileInfo([VarStruct(u’Translation’, [1033, 1200])])。
第一篇博文终于写完啦!回头看时间跨度写太长了,以后争取一次搞定,不拖拉。
鹿子!