目前比较常见的打包exe的方法都是通过Pyinstaller实现的,本文也将使用这种常规方法。如果你已经熟悉这方面的内容,可以直接向下滑动到本文的后半部分。为什么要打包?众所周知,Python脚本无法在没有安装Python的机器上运行。那么如果我们写一个数据分析/办公自动化的小脚本,想分享给我的同事,但是她的电脑没有安装Python。这时候如果把脚本打包成exe文件在微信上发给她,即使她电脑上没有安装Python解释器,这个exe程序也可以运行。是不是很美?(当然,如果你想通过帮忙安装Python来拉拢小姐姐,就当我没说吧)安装Pyinstaller,首先要安装Pyinstaller,在cmd中直接使用pip命令pipinstallpyinstaller.如果网速太慢,可以切换到国内源来提速。本文其他部分直接使用国内资源,不再重复注释。pipinstall-ihttps://pypi.douban.com/simple/pyinstaller#豆瓣源pipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simplepyinstaller#清华源Pyinstaller打包步骤这里我们就拿这个之前《Python自动化办公 | 同事要我帮忙补写178份Word日报!》的python代码,作为案例来演示。将脚本py_word.py、待处理的表文件workbook.xlsx、准备好的软件图标图片chengzi.ico放在我电脑F:\py_word目录下(有兴趣的可以在文末下载)文章)1.在cmd中切换到我们刚才放文件的目录2.执行命令Pyinstaller-F-w-ichengzi.icopy_word.py。执行过程很长,所以没有录制动画。执行后会发现当前目录下多了几个文件夹,打开名为dist的文件夹。生成了一个名为py_word的exe应用程序,图标也是我们设置的橙色图案,看来已经成功了一半。如果不想运行,能不能试试正常生成word日报?打包exe后,执行成功,可惜文件有点大(339M)。Pyinstaller参数的详细解释返回刚才执行的命令Pyinstaller-F-w-ichengzi.icopy_word.py解释Pyinstaller的参数,其中-F参数代表制作一个独立的可执行程序。-w表示程序启动时不打开命令行。如果不加-w参数,会出来一个黑洞的控制台窗口。比如我刚才在脚本里加了一行print('HelloWorld!'),所以不要放-w参数,否则运行的时候会报错。毕竟,HelloWorld!需要在命令行上打印。此外,-w参数在使用GUI界面时非常有用。最后一个-ichengzi.ico指的是设置自己的图标样式,因为默认打包后的图片如下图。这个参数也可以写成--icon=chengzi.ico最后稍微总结一下:以上三个是比较常用的参数。其他参数详见下表。一是可以找专门的ico图片网站,但是都是小众的,图片库也小。另一个可以自己生成。这里给大家分享一个可以把其他格式的图片转成ico格式的网站:https://app.xunjiepdf.com/img2icon/ico图片格式转换压缩就绪,小伙伴们快来最激动人心的时刻,新生成的exe太大,300多M的软件很难通过微信发送。我也尝试过很多方法,比如:修改spec文件自定义打包、pipenv虚拟环境、使用开源upx压缩等,但往往过程比较繁琐,或者成功率不高(取决于如果压缩失败,请面对)。而我要分享的是我一直在使用的最简单成功率很高的方法——conda创建虚拟环境。为什么Python包这么大?在压缩打包之前,先简单说一下为什么Python包太大?Python打包exe,不仅体积大而且运行速度极慢。大多数解释型语言都是这样,但Python尤为突出。解决大而慢的问题,只有编译型语言,比如C、C++,甚至VB要好得多,体积最小的就是汇编。[1]另外知乎有大佬说是因为“Anaconda内置库很多,打包的时候把很多不需要的模块打包进去,必须用纯Python打包”。所以我们可以模拟一个新的环境,它只安装我们打包必须的工具包。那么最适合的就是——虚拟环境!Python中创建虚拟环境的方法有很多种,我是Anaconda的忠实用户。如果你像我一样,那很简单。(也可以用Virtualenv、Pipenv搭建虚拟环境,好好利用搜索,方法类似)先记住几个命令,很简单condacreate-n虚拟环境名python==3.6#createvirtualenvironmentcondaactivatevirtualenvironmentname#激活虚拟环境condadeactivate#退出虚拟环境从开始菜单运行“AnacondaPrompt”,在出现的界面输入创建虚拟环境的命令。基于python3.6版本成功创建名为aotu的虚拟环境。创建过程中需要回复(y/n),Yes,然后激活虚拟环境conda安装的虚拟环境,虚拟环境的目录会生成在anaconda安装目录下的env目录下。当然我们也可以在刚才的窗口中使用命令condainfo--envs来查看conda环境下虚拟环境安装所需要的所有库。上面我们已经创建并激活了一个名为aotu的虚拟环境。输入condalist可以查看当前虚拟环境中安装的Libraries。我们打开待打包的Python脚本,对比上图发现需要额外安装pandas和docx这两个库。当然,打包必不可少的pyinstaller库也是少不了的。待打包脚本安装库的过程不再赘述docxpipinstall-ihttps://pypi.tuna.tsinghua.edu.cn/simplepyinstaller安装后可以看到已经安装成功。还是有一些因为这些库安装的,不用理会。Pyinstaller打包步骤这里不再赘述,直接换苹果图标试试Pyinstaller-F-w-iapple.icopy_word.py生成成功压缩到29.8M。如果不导入pandas这个大神,10M多应该能跑。没问题最后简单总结一下虚拟环境+打包的整个过程(只有三步):#创建虚拟环境condacreate-naotupython=3.6#激活虚拟环境condaactivateaotu#PyinstallerpackagePyinstaller-F-w-iapple.icopy_word.py一些小坑的总结1、说起来还是有点玄学,我在两台电脑上都执行了上面一模一样的流程。其中一个上面显示缺少xlrd这个库,安装后成功打包,大小也是一样的。小伙伴们可以在文末获取文件,也可以试试看。2、安装库的时候注意一些库名。比如docx库不需要pipinstalldocx,需要pipinstallpython-docx,而且有些库可能会因为版本不同而无法使用。只是更频繁地撞墙。3、为了防止打包时一些库安装错误,可以先在虚拟环境中执行Python脚本。如果操作正确,那就打包,这样比较安全。4.最后,如果要删除虚拟环境,可以执行以下命令condaremove-naotu--all5。如果打包为exe,尽量选择python3.6+32位版本,因为win64位系统向下兼容32位程序。但是如果不考虑32位系统,那也无所谓。可以直接打包python64位版本,但是只能在win64位系统上运行。[2]
