windows项目一般都用C++进行开发,其实很多语言都能开发windows程序,在这里重点介绍python+QT的实现,并打包成exe可执行程序,遇到很多问题,现总结一下。
pyinstaller包可以很方便的将python程序打包成windows下面可执行的exe程序,如果还未安装,需要通过下面命令进行安装。
pip install pyinstaller
安装后,运行pyinstaller.exe
命令出现使用方法,表示安装成功了。
参数介绍
选项 | 说明 |
---|---|
-F | 打包一个exe文件 |
-D | 打包多个文件,在dist中生成很多依赖文件 |
-d | 产生debug版本的可执行文件 |
-w | 程序启动不打开命令行 |
利用pyinstaller对python+QT进行打包发布,可能会遇到一系列的问题,比如打包过程报错、打包后无法运行等。在这种情况下不要自暴自弃,仔细分析问题,逐一解决。
打包命令,可以用pyinstaller.exe -F -w MyMainWindow.spec
,其中MyMainWindow.py是主程序入口。如果没有MyMainWindow.spec可以先运行pyinstaller.exe -F -w MyMainWindow.py
,运行后会自动出现MyMainWindow.spec文件,之后打包就可以通过MyMainWindow.spec来打包了。之所以要用MyMainWindow.spec进行打包,是因为这个文件里可以添加一些配置,pyinstaller会根据配置来进行打包。
打包完成后,在项目根目录的build目录下,会出现包的构建文件,dist目录下出现exe文件,这个MyMainWindow.exe文件就是我们需要的可执行程序。
打包过程往往都不是一帆风顺,总会遇到各种各样的问题。
问题1、找不到对应的模块
306087 INFO: Loading module hook "hook-Crypto.py"...
Traceback (most recent call last):
File "" , line 2, in <module>
ModuleNotFoundError: No module named 'Crypto.Math'
这种问题优先考虑对没有的模块进行安装,在这个问题上,走了好多弯路,才找到最终的解决方法。我使用的是python3.6,如果直接安装pycrypto,是会报错的,因为pycrypto在很久之前就不更新了。之后pycrytodome取代了它,现在python3.6支持的是pycrytodome,安装就变成了pip install pycryptodome
。
安装后,重新打包,问题就解决了。
另外一个问题如下
318081 INFO: Matplotlib backend "GTK": ignored
Gtk* backend requires pygtk to be installed.
321161 INFO: Matplotlib backend "GTKAgg": ignored
Gtk* backend requires pygtk to be installed.
322024 INFO: Matplotlib backend "GTKCairo": ignored
No module named 'gtk'
虽然提示缺少gtk,但是并没有提示ModuleNotFoundError,并且exe程序可以成功的打出包来。首先需要做的是,确定exe程序能不能正常运行。结果是,可以正常运行。然后分析一下原因,为什么用QT编写的程序,会用到gtk呢。从日志中可以看出,Matplotlib的backend用到了gtk,但是代码里并没有一个地方引入了Matplotlib。分析一下,可能存在两种原因,代码里引入的某个模块依赖于Matplotlib,或者pyinstaller打包的时候会将python目录下所有的包都进行打包。无论哪种原因,只要最终打出来的包功能正常,就不必纠结。这更像是一种提示,而不是一个错误。
问题2、exe程序运行找不到路径
程序主目录的setting目录下,存在配置文件
代码在运行的过程中,需要加载setting下面的配置文件
def initItems(self):
self.paraName.clear()
dirs = os.listdir('setting/')
for f in dirs:
if 'param_' in f:
param = f.replace('param_', '')
self.paraName.addItem(param)
这样的结构,直接运行是没问题的。如果要打包成exe运行,这种目录结构就不存在了,程序就会由于找不到配置文件而闪退。
要解决这样的问题,只需要重新规划一下目录结构。最终的目录只保留build
和dist
两个打包文件夹,其余的python文件最好都放到根目录下。
如果需要在打包exe后,继续采用之前的目录结构,可以在代码中写一个安装模块。这样让用户进行安装,在用户所在的PC上自动规划成需要的目录结构。
打包后生成了一个exe程序,运行后效果图如下,只是半成品效果图,最终产品不宜展示。
以上是所有内容,如有问题,请联系作者~