pyinstaller精简打包python项目完整流程,含常见问题解决方案

最近写了一个python爬虫小项目,想打包成一个exe文件,放在其他电脑上使用。但是没想到一个20B的py文件打包过程却十分艰辛。先后经历了打包失败无法运行,打包成功但是运行十分缓慢,打包了一大堆不需要的包,导致打包文件达到了500MB等。最后终于通过了一系列面向CSDN的编程,将最后的打包文件缩减到90MB,也算是有些收获。

整个打包流程比较长,因为从环境配置开始就得做准备,这样才能确保最后打包出来的文件只包含我们需要的库,而不需要其他冗余的。

一、安装配置虚拟环境virtualenv

之前我所有的Python项目,都是在Anaconda环境下完成的,这个环境的好处是方便第三方包的管理,大部分情况是没有坏处的。然而,一旦我们想把python项目打包,问题就凸显出来了。由于在进行Pyinstaller打包时,会将环境里所有的package一起打进去,这就导致了非常多曾经下载过的,但是在这个项目中没用到的package,也会成为程序的一部分,大大增加了整个文件的大小。例如说,我这个项目其实并没有用到pandas和numpy,但是这两个项目却占了我两百多MB的资源,非常不值得。

我也曾经根据某些解决方案的建议,尝试在Pyinstaller时,加上一句–exclude pandas,但结果就是我整个程序就运行不了了。尝试了一圈,发现只有重新配置一个虚拟环境才能彻底解决问题。

配置虚拟环境的原因和方法可以参考以下资料:

https://blog.csdn.net/pdcfighting/article/details/104075212

我直接把流程贴出来就好。

  1. 打开windows命令行,以下所有步骤都是在命令行进行!
  2. 检查是否把python配置到了环境中了,可以用下面的方法检查
python --version
  1. 如果显示错误,或者根本没反应,那就说明你本身的环境变量没有把python.exe配置进去,配置的大概率是anaconda的,而不是python本身的。你只要找到原本python文件夹中的路径,添加到环境变量中,就可以了。
  2. 再试试以下能否使用pip或者pip3,方法同样是用
pip --version
  1. 如果失败,则把python文件夹下\Scripts也添加到环境变量中就可以了。
  2. 安装python虚拟环境virtualenv,安装完以后可以根据提示决定要不要upgrade以下
pip install virtualenv
  1. 随便一个地方新建一个文件夹, 用来存放虚拟环境的。比如我就在I盘新建了一个virtualenv文件夹。然后命令行cd到这个文件夹下。
cd I:
cd virtualenv
  1. 执行命令,新建环境,可以命名为你的项目名称。在原文中,作者让我再最后加上一句–no-site-packages,但是我在执行后却出错了。后来查一下,发现virtualenv在20版本以后就已经默认是–no-site-packages,不再需要另外加,另外加会报错。
virtualenv grabstock
  1. 这时候如果你去看你的I盘,会发现在virtualenv文件夹下多了一个grabstock文件夹,里面还有一些类似python的文件包和文件夹,这就是一个十分初始的python环境了。这个时候,我们需要激活这个虚拟环境,方法是进到Scripts再执行activate。
cd grabstock\Scripts
activate
  1. 激活以后,会发现命令行的最前面已经变成了你的项目名称。此时你可以输入pip list,检查已有的包。通常来说,新的python环境只会有pip, setuptools和wheel3个包。你可以选择在这里就把你之后项目会用到的包安装进去,当然,也可以在实际操作中再在pycharm里安装也行。怎么开心怎么来。
    虚拟环境已经被激活,我们最后可以通过deactivate命令退出虚拟环境,完成命令行部分的操作。

二、从Pycharm新建项目,并使用虚拟环境

新建项目,注意一下地方需要修改
pyinstaller精简打包python项目完整流程,含常见问题解决方案_第1张图片
Base Interpreter要记得换成自己虚拟环境中的那个python.exe。

点击创建,之后的事情就跟你平时用Pycharm一样了,没啥特别的。

在我的项目中,引用了PyQt5, bs4,googletrans和zhconv(简繁体转换)四个包,本身就有了170MB的大小。

三、Pyinstaller打包文件

首先,在Setting→Project Intepreter里安装pyinstaller。
安装完成后,在项目那边右键,选择Open in Terminalpyinstaller精简打包python项目完整流程,含常见问题解决方案_第2张图片
在命令行输入以下指令,先打包成一个单文件。文件会放在源目录/dist文件夹。

其中-F是打包成单文件的意思。如果你项目本身较小,是可以考虑使用这个指令。但是如果你引用了较多的第三方包,建议你跟我一样,不要这个-F,直接打包成一个含有完整链接的文件夹。
另外Main.py是我的主程序,我其实还另外写了几个Py文件,从主程序中引用。这里不需要特别把其他程序都一起打包的,只需要打包主文件就行。
pyinstaller精简打包python项目完整流程,含常见问题解决方案_第3张图片
我第一次做到这里时,就遇到了一个小问题。因为我用到了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打包了。

四、使用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
pyinstaller精简打包python项目完整流程,含常见问题解决方案_第4张图片

以上就是打包python项目的全流程。

你可能感兴趣的:(个人项目)