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中
在该目录下用记事本,notepad++或者sublime新建一个文本,输入
@echo off
D:\Anacoda3\python.exe D:\Anacoda3\Scripts\cxfreeze %*
语句具体作用,详见大神的说明,第二行中第一个是python环境对应的的python.exe目录,后面的就是刚才说的cxfreeze文件,路径要更改为你自己的
然后,将该文件命名为cxfreeze.bat,保存之后,再输入
cxfreeze -h
显示的如果是
就应该没问题了
生成exe
命令行中cd到你的python代码文件目录下,输入
cxfreeze xxxx.py --target-dir dist
(xxxx.py是你的python文件名)
等待一下,exe就应该生成成功了(在同文件目录中的dist里面)
cxfreeze会自己寻找python文件所使用的包和其他配置文件(比如图像,音频等),比较方便,我也没有出现编码的奇奇怪怪的错误