pyinstaller的大坑

最近需要将一个python的Gui程序打包为exe

按照网上博客的建议——“py2exe很久没有更新,完全不能使用,应该换用pyinstaller”, 我安装pyinstaller后, "果不其然"又遇上了python的经典编码问题, "pyinstall UnicodeDecodeError: 'gbk' codec can't decode byte 0xa8 ...", 按照报错信息到了pyinstaller安装目录下面的winmanifest.py更改1075行为

with open(filename,'r', encoding='UTF-8') as f:

之后, 编码错误没有了, "顺利"生成了exe

然而, 问题远远没有解决, exe打开时里面出现中文乱码,并且闪退.

好的, 又按照博客的说法,把什么pyqt5复制到python文件目录下, 貌似对我这个问题没有用.

我坚持不懈, 我又把python文件复制到了pyqt5文件下, 还是不行

可能是我还调用了sys,math等库的原因,实在是太麻烦了,不知道究竟生成这个exe需要哪些包的哪些文件, 博客论坛里面还有人说复制dll的, 这么多, 太麻烦, 果断弃坑!

cxfreeze的新坑

cxfreeze虽然安装过程有些坑,但是生成exe的过程十分顺利, 我这里对于cxfreeze的安装过程做一下汇总

下载cxfreeze的whl文件

一种下载地址是sourceforge的, 最新版只有python 3.4,很久没有再更新了,我的环境是python 3.6, 这个不能派上用场

另外一种是在pypi上面,只有python 3.5,python 3.6和python 2.7的,跟上面的sourceforge配合起来刚刚好,根据你自己的python版本选择下载就行了, 我的环境是python 3.6 64位,所以选择cx_Freeze-5.1.1-cp36-cp36m-win_amd64.whl 

此外,好像还可以直接安装exe, 我没有尝试过,也没有保存这个的下载链接,有需要自己找吧, 我觉得下载whl就是一种比较稳妥的方法了

安装cxfreeze

命令行下cd到whl的下载目录,然后输入

python install cx_Freeze-5.1.1-cp36-cp36m-win_amd64.whl

上面的whl文件名根据你自己下载的文件名进行更改

检测安装

cxfreeze的名称真是千变万化,有叫cx-freeze的,还有叫cx_freeze,或者cx_Freeze等等的, 不同的文件叫法还不一样,真是令人无语

在python交互式环境中应该输入

import cx_Freeze

如果没有报错就说明,文件安装无误,跟你的python环境是相匹配的

但是,问题还没有结束,我们生成exe的时候,是用的

cxfreeze xxxx.py --target-dir dist

需要cxfreeze命令

这个时候输入

cxfreeze -h

查看版本号

如果不出意外的话, 应该是会报错的,应该会显示"'cxfreeze' 不是内部或外部命令,也不是可运行的程序,或批处理文件。"的信息

解决报错

找到你的cxfreeze在Scripts中的安装位置,我这里是在D:\Anacoda3\Scripts中

python生成exe文件后闪退 为什么python生成exe程序闪退_cxfreeze

在该目录下用记事本,notepad++或者sublime新建一个文本,输入

@echo off
D:\Anacoda3\python.exe D:\Anacoda3\Scripts\cxfreeze %*

语句具体作用,详见大神的说明,第二行中第一个是python环境对应的的python.exe目录,后面的就是刚才说的cxfreeze文件,路径要更改为你自己的

然后,将该文件命名为cxfreeze.bat,保存之后,再输入

cxfreeze -h

显示的如果是

python生成exe文件后闪退 为什么python生成exe程序闪退_pyinstaller_02

就应该没问题了

生成exe

命令行中cd到你的python代码文件目录下,输入

cxfreeze xxxx.py --target-dir dist

(xxxx.py是你的python文件名)

等待一下,exe就应该生成成功了(在同文件目录中的dist里面)

cxfreeze会自己寻找python文件所使用的包和其他配置文件(比如图像,音频等),比较方便,我也没有出现编码的奇奇怪怪的错误