最近有需求要做个界面,并且打包到各种(win,android,linux,mac等)平台的可执行程序,先拿基础的windows练手。
如何写界面和跨平台打包,我下一篇博文再介绍。
应用到的技术介绍
我的环境是在anaconda3 prompt,也就是我之前博文里面的环境做的。
- 使用pyinstaller 打包没话说
- 使用python虚拟环境打包(下面会讲原因)
- 遇到的一些坑和问题
解释一下为什么用虚拟环境打包
因为pycharm或者你日常工作的python环境中,基本上会有很多用到和的没用到的库,在pyinstaller 打包的时候会一并打包进去,导致基本上一个很简单的py脚本,打包出来200M以上(我滴妈耶)
查看当前环境的库,anaconda中可以用下面的命令:
conda list
能看到很多很多。。。。
因此,我们要建一个干净的虚拟环境,只装我们需要的库,然后再用pyinstaller 打包。
进入打包流程
首先可以,使用下面的命令,查看一下anaconda里面已经创建了的环境:
conda env list
上面是我平时用的base(py3.7),py2(py2.7),py36(py3.6),nilmtk-env(电荷分解环境)
现在我们新建一个虚拟环境:
(虚拟环境的python版本,根据你要打包的文件选择,我这里是3.6)
(work_space 是虚拟环境的名字,可以自己起名)
conda create --name work_space python=3.6
输入 y 就可以继续安装虚拟环境的python了。(开vpn会快)
环境创建结束之后,使用
conda env list
再来查看一下我们的所有环境列表。
可以看到我们新建环境的名称和目录。
之后使用命令:
(work_space是你创建的虚拟环境的名字)
activate work_space
来切换到新建的虚拟环境
接下来我们在这个环境里面安装pyinstaller
pip install pyinstaller
之后用pip安装我们要编译的python文件需要用到的库,比如说我装了指定版本的numpy和pyaudio
环境都搞好了,我们就可以打包啦
打包命令参照https://www.jianshu.com/p/48f6dea265eb讲的很清楚
我的程序很简单就一个py脚本,在控制台里面显示,我只需要打包为一个exe。(如果你的脚本有很多,请参照上面那个链接的打包教学,吧py关联起来打包)
切换到要打包的py文件目录,
然后我的命令就是
(打包getChord_micphone.py为一个.exe,且显示控制台)
pyinstaller -c -F getChord_micphone.py
执行后一大堆英文
最后会显示出打包成功,和exe的路径。
一看
哇塞!
只有18Mb!!
超开心有没有!!!
然后一运行。。噗。。。。闪退结束。。。。。
不要慌~~,我教你怎么看报错
切换目录到生成的.exe的目录
使用 .\ 来运行这个文件
例如我的:
.\getChord_micphone.exe
你自己的脚本没用到这个库,对不对,他偷偷用了还没找到
所以我们打包时候屏蔽掉他
回来刚才要打包的python文件的目录
会发现这个地方多了很多文件
我们用文本编辑器或者记事本什么的,打开同名的 .spec文件
在其中的hiddenimports里面加入上面报错中找不到的那个pkg_resources.py2_warn
保存。
之后切换目录到这里,将之前的打包命令修改为,用这个配置文件打包
(getChord_micphone.spec是你的那个配置文件)
pyinstaller -c -F getChord_micphone.spec
又是一堆英文。。。
耐心等待。。。
又打包成功了
还是18Mb
轻轻双击生成的exe
搞定!~~~
收尾工作
打包完成之后,如果还需要用这个虚拟环境打包同一个项目,就可以保留了。
如果不需要这个虚拟环境的话,
conda env list
activate 你之前的虚拟环境名称
delete -n 要删除的虚拟环境名称 --all
就OK了。