最近写了一个python爬虫小项目,想打包成一个exe文件,放在其他电脑上使用。但是没想到一个20B的py文件打包过程却十分艰辛。先后经历了打包失败无法运行,打包成功但是运行十分缓慢,打包了一大堆不需要的包,导致打包文件达到了500MB等。最后终于通过了一系列面向CSDN的编程,将最后的打包文件缩减到90MB,也算是有些收获。
整个打包流程比较长,因为从环境配置开始就得做准备,这样才能确保最后打包出来的文件只包含我们需要的库,而不需要其他冗余的。
之前我所有的Python项目,都是在Anaconda环境下完成的,这个环境的好处是方便第三方包的管理,大部分情况是没有坏处的。然而,一旦我们想把python项目打包,问题就凸显出来了。由于在进行Pyinstaller打包时,会将环境里所有的package一起打进去,这就导致了非常多曾经下载过的,但是在这个项目中没用到的package,也会成为程序的一部分,大大增加了整个文件的大小。例如说,我这个项目其实并没有用到pandas和numpy,但是这两个项目却占了我两百多MB的资源,非常不值得。
我也曾经根据某些解决方案的建议,尝试在Pyinstaller时,加上一句–exclude pandas,但结果就是我整个程序就运行不了了。尝试了一圈,发现只有重新配置一个虚拟环境才能彻底解决问题。
配置虚拟环境的原因和方法可以参考以下资料:
https://blog.csdn.net/pdcfighting/article/details/104075212
我直接把流程贴出来就好。
python --version
pip --version
pip install virtualenv
cd I:
cd virtualenv
virtualenv grabstock
cd grabstock\Scripts
activate
新建项目,注意一下地方需要修改
Base Interpreter要记得换成自己虚拟环境中的那个python.exe。
点击创建,之后的事情就跟你平时用Pycharm一样了,没啥特别的。
在我的项目中,引用了PyQt5, bs4,googletrans和zhconv(简繁体转换)四个包,本身就有了170MB的大小。
首先,在Setting→Project Intepreter里安装pyinstaller。
安装完成后,在项目那边右键,选择Open in Terminal
在命令行输入以下指令,先打包成一个单文件。文件会放在源目录/dist文件夹。
其中-F是打包成单文件的意思。如果你项目本身较小,是可以考虑使用这个指令。但是如果你引用了较多的第三方包,建议你跟我一样,不要这个-F,直接打包成一个含有完整链接的文件夹。
另外Main.py是我的主程序,我其实还另外写了几个Py文件,从主程序中引用。这里不需要特别把其他程序都一起打包的,只需要打包主文件就行。
我第一次做到这里时,就遇到了一个小问题。因为我用到了zhconv这个第三方包,它其实引用了自带的一个json库。然而在打包的时候,并没有把这个json一起打包进去,因此提示报错:
这里的解决方案也查阅了好久才发现的,具体可见:
https://blog.csdn.net/qq_18453581/article/details/90314701
简单来说,就是在源目录下,新建resource文件夹,将zhconv中的zhcdict.json放入该文件夹中。同时,在pyinstaller时,使用下列代码,将resource加到打包项目中,就可以了。
pyinstaller Main.py --add-data="resource;."
另外,我在一开始打包完成后,执行程序时一旦出错,会直接关闭主页面,不会跳出任何提示。这里的解决方案是,打开windows命令行,将你要执行的exe文件直接拖到命令行窗口中,此时会显示如下状态。直接按回车,就能在命令行下执行文件,就算出错,也能查看到报错内容。
如此一来,就完成了整个项目的打包。通常来说,使用文件夹形式的打包,比单文件打开快得多。但是有时候,我们就想使用单文件来执行,又想保证运行速度,那就需要用到enigma virtual box打包了。
这个解决方案是参考下文连接的。
https://blog.csdn.net/qq_25921925/article/details/103949384
简单步骤如下:
1.去官网下载Enigma
https://enigmaprotector.com/en/downloads.html
2. 安装完成后,打开窗口,并进行以下操作
3. Enter Input File Name要选择你打包文件夹中的那个exe文件。Enter Output File Name可以随意选择你想存放的地点
4. 在下方file处点击Add,并选择Add Folder Recursive,接着选择dist文件夹下你的打包后项目文件夹。
5. 点击%DEFAULT FOLDER%左边的加号,找到执行文件main.exe,选择Remove,把它移除。
6. 点击Process
以上就是打包python项目的全流程。