本文主要是讲下如何用Pyinstaller将python GUI程序打包为exe应用程序,这里我只讲我用到过的部分,所以不是很全面。

通过前面几篇文章,我们现在有了一个简单的基于PyQt的GUI应用程序,但是目前只能在安装了Python和PyQt的环境下使用,如果就这样交给其他人用,特别是没接触过Python的人,恐怕是给自己找骂,而且也不利于保护自己的代码,因而很有必要将代码打包为exe应用程序(我这里只针对windows而言)。

我们使用Pyinstaller实现这个目的。

一、安装Pyinstaller,命令pip install pyinstaller,如下图:

python如何打包成sh python如何打包成带UI的exe_python

从上图中可以看到,pyinstaller包依赖于future和pypiwin32,所以如果是离线安装的话,要先安装这两个包。

二、打包exe

程序涉及的文件如下图:

python如何打包成sh python如何打包成带UI的exe_python如何打包成sh_02

cmd进入程序目录,执行命令:pyinstaller -F -w --icon=roman.ico 'mainform.py'。其中,-F表示生成单exe可执行文件,-w表示窗体程序,--icon是设置exe的显示图标,'mainform.py'是程序的入口。一阵刷屏之后,终于打出成功的提示:

python如何打包成sh python如何打包成带UI的exe_ico_03

程序目录下多了几个文件夹和一个spec文件,其中的dist文件夹内就是我们生成的exe应用程序,如下图,文件大小8.5M:

python如何打包成sh python如何打包成带UI的exe_ico_04

执行之,应该能看到程序界面,可是......弹出的却是个错误框:

python如何打包成sh python如何打包成带UI的exe_ico_05

有点崩溃,但是别急,很快就能解决,这个错误的原因在于pyinstaller找不到PyQt库,如果是通过网上封装好的pyqt安装程序包安装的,则不会出现这个问题,而我们是通过pip安装的,没有将pyqt的路径加入环境变量。解决办法是在打包命令中加入paths参数:pyinstaller --paths C:\Users\......\Python35-32/Lib/site-packages/PyQt5/Qt/bin -F -w --icon=roman.ico 'mainform.py' 或者设置下环境变量。这时,再看下生成的exe:

python如何打包成sh python如何打包成带UI的exe_应用程序_06

文件大小已经由8.5M增大到14.5M了,再次执行之,ok,看到了我们的界面,而且功能也是ok的:

python如何打包成sh python如何打包成带UI的exe_ico_07

至此,程序打包完毕。需要注意的是,pyinstaller官方最新版本是3.2.1,该版本不支持python 3.6,在python 3.6打包的话,会报异常:IndexError: tuple index out of range,看来最新的可能并不是最好的。