最近有需求要做个界面,并且打包到各种(win,android,linux,mac等)平台的可执行程序,先拿基础的windows练手。

如何写界面和跨平台打包,我下一篇博文再介绍。

应用到的技术介绍

我的环境是在anaconda3 prompt,也就是我之前博文里面的环境做的。

  1. 使用pyinstaller 打包没话说
  2. 使用python虚拟环境打包(下面会讲原因)
  3. 遇到的一些坑和问题

解释一下为什么用虚拟环境打包

因为pycharm或者你日常工作的python环境中,基本上会有很多用到和的没用到的库,在pyinstaller 打包的时候会一并打包进去,导致基本上一个很简单的py脚本,打包出来200M以上(我滴妈耶)

查看当前环境的库,anaconda中可以用下面的命令:

conda list

python pyinstarller 打包 exe ddddocr 出错 python打包exe无法运行_windows


能看到很多很多。。。。

因此,我们要建一个干净的虚拟环境,只装我们需要的库,然后再用pyinstaller 打包。

进入打包流程

首先可以,使用下面的命令,查看一下anaconda里面已经创建了的环境:

conda env list

python pyinstarller 打包 exe ddddocr 出错 python打包exe无法运行_windows_02


上面是我平时用的base(py3.7),py2(py2.7),py36(py3.6),nilmtk-env(电荷分解环境)

现在我们新建一个虚拟环境:
(虚拟环境的python版本,根据你要打包的文件选择,我这里是3.6)
(work_space 是虚拟环境的名字,可以自己起名)

conda create --name work_space python=3.6

python pyinstarller 打包 exe ddddocr 出错 python打包exe无法运行_虚拟环境_03

输入 y 就可以继续安装虚拟环境的python了。(开vpn会快)

环境创建结束之后,使用

conda env list

再来查看一下我们的所有环境列表。

python pyinstarller 打包 exe ddddocr 出错 python打包exe无法运行_python_04


可以看到我们新建环境的名称和目录。

之后使用命令:
(work_space是你创建的虚拟环境的名字)

activate work_space

来切换到新建的虚拟环境

python pyinstarller 打包 exe ddddocr 出错 python打包exe无法运行_配置文件_05


接下来我们在这个环境里面安装pyinstaller

pip install pyinstaller

python pyinstarller 打包 exe ddddocr 出错 python打包exe无法运行_anaconda_06

之后用pip安装我们要编译的python文件需要用到的库,比如说我装了指定版本的numpy和pyaudio

python pyinstarller 打包 exe ddddocr 出错 python打包exe无法运行_虚拟环境_07

环境都搞好了,我们就可以打包啦
打包命令参照https://www.jianshu.com/p/48f6dea265eb讲的很清楚

我的程序很简单就一个py脚本,在控制台里面显示,我只需要打包为一个exe。(如果你的脚本有很多,请参照上面那个链接的打包教学,吧py关联起来打包)

切换到要打包的py文件目录,

然后我的命令就是
(打包getChord_micphone.py为一个.exe,且显示控制台)

pyinstaller -c -F getChord_micphone.py

python pyinstarller 打包 exe ddddocr 出错 python打包exe无法运行_配置文件_08


执行后一大堆英文

python pyinstarller 打包 exe ddddocr 出错 python打包exe无法运行_windows_09


最后会显示出打包成功,和exe的路径。

python pyinstarller 打包 exe ddddocr 出错 python打包exe无法运行_anaconda_10


一看

哇塞!

只有18Mb!!

超开心有没有!!!

然后一运行。。噗。。。。闪退结束。。。。。

不要慌~~,我教你怎么看报错

切换目录到生成的.exe的目录
使用 .\ 来运行这个文件
例如我的:

.\getChord_micphone.exe

python pyinstarller 打包 exe ddddocr 出错 python打包exe无法运行_配置文件_11


你自己的脚本没用到这个库,对不对,他偷偷用了还没找到

所以我们打包时候屏蔽掉他

回来刚才要打包的python文件的目录

会发现这个地方多了很多文件

python pyinstarller 打包 exe ddddocr 出错 python打包exe无法运行_配置文件_12


我们用文本编辑器或者记事本什么的,打开同名的 .spec文件在其中的hiddenimports里面加入上面报错中找不到的那个pkg_resources.py2_warn

python pyinstarller 打包 exe ddddocr 出错 python打包exe无法运行_windows_13


保存。

之后切换目录到这里,将之前的打包命令修改为,用这个配置文件打包
(getChord_micphone.spec是你的那个配置文件)

pyinstaller -c -F getChord_micphone.spec

python pyinstarller 打包 exe ddddocr 出错 python打包exe无法运行_python_14


又是一堆英文。。。

耐心等待。。。

python pyinstarller 打包 exe ddddocr 出错 python打包exe无法运行_windows_15


又打包成功了

还是18Mb

轻轻双击生成的exe

python pyinstarller 打包 exe ddddocr 出错 python打包exe无法运行_虚拟环境_16


搞定!~~~

收尾工作

打包完成之后,如果还需要用这个虚拟环境打包同一个项目,就可以保留了。

如果不需要这个虚拟环境的话,

conda env list
activate 你之前的虚拟环境名称
delete -n 要删除的虚拟环境名称 --all

就OK了。