记录一下使用pyinstaller打包exe的经历,主要参考了这篇知乎:别再问我Python打包成exe了(最适合小白的终极解答)!
前提是得安装好pyinstaller包,这个就不说了
之前打包时的主要问题是pyinstaller会把程序用到的所有第三方包及相关的包都打包进来,以至于程序体积非常大,这次主要学习了一下怎么在虚拟环境里只把程序需要用的包打包进来,减小程序体积。
第一步:创建虚拟环境需用到以下命令:
conda create -n 虚拟环境名字 python==3.6 #创建虚拟环境 conda activate 虚拟环境名字 #激活虚拟环境 conda deactivate #退出虚拟环境
我先创建了一个名字叫abc的虚拟环境
第二步:激活虚拟环境激活虚拟环境后命令行变成这样子
然后将目录切换到要打包的python程序目录下:
第三步,运行pyinstaller进行打包
这里面的参数解释如下表
我用的这些参数实际上是产生了一个目录用于部署、带窗口的可执行程序、设置了一个icon
正常情况下pyinstaller会显示一系列命令,如果最后显示completed successfully就是成功了,如下图所示。
打包成功之后原来目录下就有了build和dist两个文件夹,我们所打包地exe就躺在dist文件夹下的程序名文件夹里。
Bug shoting当然绝大多数情况下并没有这么顺利,需要来回折腾几下。
1.虚拟环境缺第三方包的问题首先可能遇到的一个问题是虚拟环境中缺少程序所用到的第三方包,这个好解决,直接在虚拟环境下pip install就行了。举个例子:
当然更快的是用国内的服务器来安装:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyinstaller #清华源 pip install -i https://pypi.douban.com/simple/ pyinstaller #豆瓣源2.另外的一些奇奇怪怪的问题
我这个程序里用的是pyqt5做的界面,用pyinstaller打包时报错说C:UsersAdministratorAppDataLocalpyinstallerbincache00_py38_64bitpyqt5路径下找不到QtGui.pyd、Qtcore.pyd等等文件,然后我用everything搜了一下,这些文件明明是安装了的,这就很离谱,最后直接简单粗暴地把这几个pyd拷贝到那个目录里才解决了问题。
3.另外还有一些问题没有解决我写的这个程序有的功能依赖于一些Fortran代码,由于不太懂python和fortran联合编程,就采用调用一个fortran编写的exe,然后再进行接下来的操作的方法。这样一来打包python的时候就需要把fortran生成的这个exe打包进去,目前暂时还没找到方法,于是直接将fortran的exe丢到python打包形成的目录里让它调用了。后面有时间再研究一下这个。



