天天看点

python3.6 + pyinstaller3.5打包程序

背景:做数据挖掘作业,涉及到python中sklearn中的很多库,打包时发生很多问题

打包python真是个大坑,其实用不用IDE差别并不大,pycharm里面打开的命令行就不是命令行了?

我的编程方案一般是VScode+命令行

本次数据挖掘一共是四个分类器,然后还有一个预处理和评估程序

运行的main.py只是用来使用四个分类器的,而我们打包的时候也只需要打包main.py即可

python3.6 + pyinstaller3.5打包程序

这个是我的程序截图

在保证的程序可以跑的情况下我们开始打包吧~

1、首先确定你的python环境,我一开始是用的conda的环境进行运行的,环境名称为tensorflow(不要吐槽我QAQ)python版本是3.6.8,然后百度一圈pip install pyinstaller ,然后 pyinstaller -F main.py。你以为就完事了???天真

首先我哪怕是在tensoflow这个环境中安装的pyinstaller,打包的时候默认仍然是我conda的自带python库3.7!打包的时候会显示你的python版本,那显然不对了,找了一圈我决定放弃conda,使用我D盘下的python3.6,这个时候要注意,下载pyinstaller必须要使用pip3 install pyinstaller,否则依然还是conda环境的默认python3.7在作祟。

2、那么我们就在我D盘下的python去打包吧,这个时候运行pyinstaller -F main.py你会发现报错utf-8编码,是的,你没有调整你命令行的编码方式,在命令行中输入chcp 65001,重新来过。

3、好了,终于在执行完pyinstaller -F main.py之后看到了success,尽管过程各种warning对不对?但是warning又不会死人。

4、打开main.py同一路径下的dist文件夹,里面有个main.exe,激动吗?点开他,能跑是你福气好,不能跑就是你的命。

5、这时候你大喊一声:我命由我不由天,点开发现报错然后它会迅速关掉,这时候就是考研你单身20年的手速了,推荐一个截图软件FastStone Capture ,把报错截图下来,如果你的错误是找不到dll,那么好你的问题是版本!!划重点敲黑板,没有哪个百度说了版本问题,比如我当时的错误就是scipy报错,你会发现报错的各种路径里都是scipy/...那么就是这个版本不对,要么你去搜一下支持的版本(虽然多半搜不到),要么就退一下嘛,也没多大事儿,多退几个 版本就知道。我原来的scipy是1.4.1,我退到了1.1.0。怎么退??当然是卸载原来的然后安装旧的啊。。

6、好了这个时候你会发现在main.py下面会有个main.spec, 那才是你真正可以编辑的打包文件,如果在你完成第五步之后还显示导入模块出错,那你就要注意这个文件了,修改文件中的hideimport=[]这一句话,把导入模块出错的模块名字写进去,记得加单引号,然后运行的时候要运行pyinstaller main.spec,因为你每运行一次pyinstaller main.py,这个main.spec就会更新一次,所以不能让他更新,直接跑pyinstaller main.spec就vans了,如果还有导入模块的错误,就继续添加。这个错的原因是pyinstaller有时候找不到你在python文件中import的库,它作为隐藏模块导入的时候找不到,因此需要你手动添加。我这个例子中就有两三个sklearn的库找不到。

7、终于最后一次pyinstaller main.spec的时候成功啦!

8、如果你的代码中含有外部数据,exl或者csv什么的,一定要注意了,如果是绝对路径可以不管,如果是相对路径,一定要把main.exe从dist中拿出来,放在和代码同样的路径下,不然会找不到data的。

完结撒花吃饭饭~~