一、背景
现在有一个hello.py文件,当你需要将这个文件运行到其他人电脑上,而且其他人电脑上没有相关环境的时候,就需要将py文件转为exe文件,点击exe文件直接运行。这里,主要介绍利用Pyinstaller库将py打包成exe。
二、 Anaconda环境创建与三方库的安装
为什么要使用Anaconda来创建新环境?因为打包之后的exe文件会很大,主要原因是它将各种三方库都打包进去了,如果不创建新环境,它就会打包系统环境内的全部三方库,导致文件更大,而且打包时间也很长,因此建议创建新环境将要使用的三方库打包进去即可,下面介绍如何使用新环境来打包py文件。
2.1 创建新环境
创建环境
conda create -n 环境名 python=版本
这里创建了一个名为hello的环境,python是3.8版本的
conda create -n hello python=3.8
激活刚创建的环境
activate hello
查看当前环境下已安装的库
conda list
2.2 三方库的安装
根据自己的py文件所需要的三方库进行安装。我这主要有两个库需要安装,分别是pymysql和akshare。
一般情况下,直接在新环境下pip install 库名即可,如果提醒你还需要装其他依赖库,按照步骤依次安装,如:
pip install pymysql
而akshare采用的是下面安装方式:
pip install akshare -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
安装完之后,可以检查一下当前安装的库是否可以运行hello.py不报错,如果没问题了就可以进行打包了。先进入hello.py的文件目录,然后python hello.py。
三、Pyinstaller打包
运行完发现没问题,开始打包。打包之前,先要安装Pinstaller库,建议安装4.10版本。
pip install pyinstaller==4.10
安装完之后正式开始打包,打包命令非常简单:具体pyinstaller参数设置请查阅其他网上资料。
pyinstaller -F hello.py
pyinstaller -D hello.py # 建议使用
这里使用pyinstaller -D hello.py
半打包的方式打包,它的好处就是使用-F全打包时,执行exe经常会出现闪退,这时候可能产生的原因,比较常见的就是少模块,也就是打包的时候它并没有给我们打包进行,那又要添加库/模块重新打包。这时如果是使用-D半打包,就可以将相关的库加入包中,而不需要重新打包,具体操作方式接下来会说。
先来打包,切换到hello.py文件目录下,执行pyinstaller -D hello.py
,稍等一会,结束之后在文件下会产生三个文件,生成的exe在dist包下,如果是全打包的方式,这里只有一个exe,没有其他文件。
点击hello.exe,如果正常打包,它就会执行相应的代码操作。但是我这会出现闪退,具体问题看不清,这时我们可以在exe所在的文件下cmd该exe,会出现相应的错误。
根据错误,执行相应的操作,这里我们发现主要问题是mini_racer.dll
。发现dist下面根本没有这个文件,所以我们要添加这个文件。
在我的电脑系统里的发现了这个文件。具体操作,先找到anaconda的安装路径包,找到该环境下的Lib文件夹,打开里面有个site-packages文件夹,这里存放的就是安装的各种环境,在里面我们找到mini_racer.dll
把该文件夹复制到dist文件夹下,也就是放exe的文件夹。
再次运行,发现还有错误,这次是akshare的错误,可以去hello环境下用刚同样的方法把少的东西复制过来。
再次运行,成功运行。
四、总结
- 尽量使用干净的环境
- 使用pyinstaller4.10版本
- 使用半打包的方式
pyinstaller -D hello.py
,缺啥补啥。