python-打包exe-pyinstaller+docker-解决文件过大以及各类打包失败问题

python-打包exe-pyinstaller+docker-解决文件过大以及各类打包失败问题

文章目录

    • python-打包exe-pyinstaller+docker-解决文件过大以及各类打包失败问题
  • 前言
  • 一、我要打包的代码
  • 二、前期准备
    • 1.py文件准备
    • 2.发现问题
  • 三、docker容器打包
  • 四、遇到问题及其解决
  • 五.附录(docker基础命令)
  • 总结


前言

如果小伙伴们希望自己写的程序可以移植到别人的电脑上运行,尤其是移植到一台没有装过python的其他电脑上,就需要将python文件打包为exe可执行文件。网上打包的方法层出不穷,但总是会出现各种问题,如:打包的文件过大(主要是因为打包的无关依赖库过多)、提示缺少相关模块(版本问题、未安装相关包)等等!本文主要使用docker容器实现对python文件的打包,用到的库有numpy、pandas以及sklearn三个超大库,实现功能较为简单,主要在于解决打包问题!


提示:以下是本篇文章正文内容,下面案例可供参考

一、我要打包的代码

本文以一个python机器学习中的sklearn库使用案例来演示打包过程,具体需要打包的代码如下,可以看到使用了依赖比较多的numpy、pandas以及sklearn库。
代码示例:

#!/usr/bin/env python
# coding: utf-8

import numpy as np
import pandas as pd
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
import sklearn.metrics as metrics
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
sc = StandardScaler()

data = pd.read_excel(r'.\data_APP.xlsx')
target=data.iloc[:,-1]
train_data,test_data,train_target,test_target = train_test_split(data,target,test_size=0.2,train_size=0.8) 
train_data = np.array(sc.fit_transform(train_data))
train_target = np.array(train_target)
test_data = np.array(sc.transform(test_data))
test_target = np.array(test_target)
clf = GaussianNB()
clf.fit(train_data,train_target) 
t_test_pre = clf.predict(test_data)
AUC = accuracy_score(test_target,t_test_pre)
print(AUC)
accuracy=accuracy_score(test_target,t_test_pre)
print(accuracy)

input()

注意,小伙伴可以在代码最后加上‘input()’,防止打包完成后exe文件运行完成后闪退的问题。

二、前期准备

1.py文件准备

①如果你使用的是jupyter noteboook需要先将ipynb文件导出为py文件,具体可参考下图操作:
python-打包exe-pyinstaller+docker-解决文件过大以及各类打包失败问题_第1张图片
然后选择相应文件夹保存即可,注意需要将所用到的数据表,例如本例中使用的data_APP.xlsx文件和py文件放在同一个文件夹里后面会用到。
②如果你使用的是jupyter lab同样需要先将ipynb文件导出为py文件,具体可参考下图操作:
python-打包exe-pyinstaller+docker-解决文件过大以及各类打包失败问题_第2张图片
然后选择相应文件夹保存即可,注意需要将所用到的数据表,例如本例中使用的data_APP.xlsx文件和py文件放在同一个文件夹里后面会用到。

注意:本文代码和data_APP.xlsx文件中均为使用中文,包括excel表里字段名称,使用中文字段使用docker容器安装可能会出现编码不适用的问题,但是题主并没有去尝试,有兴趣的同学可以去尝试,以下是我的excel文件:
python-打包exe-pyinstaller+docker-解决文件过大以及各类打包失败问题_第3张图片

2.发现问题

**发现问题:**直接在Anaconda里安装pyinstaller包,然后使用以下代码进行打包,会出现打包文件太大的问题,主要是pyinstaller会将一些代码不会用到的依赖库一起打包到exe中,具体代码如下(在Anaconda Powershell Prompt(Anaconda3)运行):
安装pyinstaller的代码:

pip install pyinstaller

使用pyinstaller进行打包
首先进入存放py文件和相关文件的文件夹,下面是本文的文件夹路径
python-打包exe-pyinstaller+docker-解决文件过大以及各类打包失败问题_第4张图片
其中dist、build、pycache、prediction_of_credict.spec是打包完成后生成的文件,请先忽略。
在shell中首先进入该文件夹

D:
cd D:\python_pack\pack\home

打包代码:

pyinstaller -F .\prediction_of_credict.py

但是,我使用这种方法进行打包时,一方面问价太大,另一方面也会打包不成功(一直在打包,从未能成功,也可能我电脑问题),如果你也是这样的话,那我们就可以进入正文。

三、docker容器打包

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。因此可以使用Docker镜像产生一个“干净”的python环境,从而顺利打包我们的python代码!
Win10 系统docker安装与配置可以参考该文章:Win10系统docker安装详解
**注意:**安装时可能需要安装一个linux的镜像,上面教程里有提到安装方法,但是在微软的商店里安装时可能会提示说你所在的区域不支持安装,请在XboxOne中安装等等的,此时只需要将你的电脑地区和时间设置为美国即可!
安装完成后我们便可以直接在Windows PowerShell使用docker命令构建docker的环境,打包python代码使用的环境镜像为cdrx/pyinstaller-windows,具体介绍可以在docker hub里面搜,pyinstaller的镜像网站:https://hub.docker.com/r/cdrx/pyinstaller-windows
装载该镜像可直接在powershell下输入:

docker pull cdrx/pyinstaller-windows

而后进入该镜像并挂载你主机的文件夹,也就是实现外面系统的某一个文件夹和docker容器内的某个文件夹的共享,从而能够将你需要打包的文件传递到docker容器内,代码如下:

docker run -it -v D:/python_pack/pack/home:/src/ cdrx/pyinstaller-windows   /bin/bash

这里的D:/python_pack/pack/home就是我外部主机存放需要打包文件的文件夹,’’:’'为主机分隔符,分割主机文件和容器文件,":"后面的/src为容器镜像文件夹,不同电脑可能会不同,具体可以在这里看到(如果你首次进入镜像不确定是不是这个文件夹,你可以先进一个镜像,看到你镜像默认的文件夹,而后再退出重新挂载,或者直接再建一个新的镜像,文末会提供简单docker命令介绍):
python-打包exe-pyinstaller+docker-解决文件过大以及各类打包失败问题_第5张图片
启动docker后,便会出现以下界面:

再容器中使用pip list命令可以看到容器中已经装载的python包,具体代码如下:

pip list

python-打包exe-pyinstaller+docker-解决文件过大以及各类打包失败问题_第6张图片

我们可以看到容器中初始的包很少,只有基础的几个包。
然后我们需要根据我们代码的需要导入相应的python库包,本案例代码中用到的便是numpy、pandas、sklearn包,因此使用以下代码分别装载相关包:

 pip install numpy==1.16.5
pip install pandas==
pip install sklearn

最终安装的包如下所示:
python-打包exe-pyinstaller+docker-解决文件过大以及各类打包失败问题_第7张图片
其中,xlrd包是后来安装的,因为打包后运行exe提示缺少xlrd,具体在后面第四节问题③中有讲。
此时便可以使用以下代码进行程序打包:

pyinstaller -F prediction_of_data.py

这里prediction_of_data.py为我们需要打包的py文件名,如果提示未找到该文件,就是你挂载到容器中的文件夹里并没有放入该文件。
打包成功后就会在你挂载的文件夹里产生如下几个文件:
python-打包exe-pyinstaller+docker-解决文件过大以及各类打包失败问题_第8张图片
在dist文件夹里就可以看到我们想要的exe可执行程序,如果你和本案例一样使用了外部数据,需要将外部程序放到exe程序所在文件夹里,也就是dist文件夹里:
python-打包exe-pyinstaller+docker-解决文件过大以及各类打包失败问题_第9张图片
双击运行就可以在shell里得到程序的输出,但是如果你的程序最后没有写input(),会出现一闪没的问题,此时,可以在程序打包之前在代码最后加上input(),也可以从cmd进入dist文件夹,在shell中运行该exe文件而不是双击它。如图所示:
python-打包exe-pyinstaller+docker-解决文件过大以及各类打包失败问题_第10张图片

四、遇到问题及其解决

①打包成功后运行exe,shell中报以下错误:
python-打包exe-pyinstaller+docker-解决文件过大以及各类打包失败问题_第11张图片
题主尝试发现该错误可能是由于pyinstaller、numpy、pandas版本问题,容器中的pyinstaller并不是最新版本,题主将pyinstaller升级到了最新版本。同时numpy、pandas可能并不支持最新版本,题主将numpy调整为1.16.5,pandas调整为了0.26.4也即使用中相应的pip命令安装对应版本的numpy和pandas,重新打包(不需要删除原来打包,秩序重新运行下打包命令即可)该问题解决。
②提示相关包的版本不支持
python-打包exe-pyinstaller+docker-解决文件过大以及各类打包失败问题_第12张图片
题主开始使用的是1.16.4的numpy,但是提示numpy版本过低,此时只需要升级numpy版本,重新打包即可!
总之:numpy、pandas的版本要适当,太新、太旧都可能使得打包失败!
③提示缺少相关的包(这个截图找不到了,这个有很明显的提示,就不赘述了)
此时只需要回到docker容器中pip install 相应包,重新打包即可!

五.附录(docker基础命令)

docker的命令非常多,系统学习可以去哔哩哔哩搜索,有很多大佬出的讲解视频,以下仅讲解几个本案例可能用到的命令(以下命令是在Windows PowerShell中运行)。
容器外命令:
①加载镜像

docker pull 镜像名(如:cdrx/pyinstaller-windows)

②进入镜像容器

docker run -it -v D:/python_pack/pack/home:/src/ cdrx/pyinstaller-windows  

-v 表示进行挂载的参数,后面跟的挂载目录上面已经说过,不再赘述。
③查看当前镜像,以及镜像下已经建立的容器

docker ps -a

python-打包exe-pyinstaller+docker-解决文件过大以及各类打包失败问题_第13张图片
④对于已经建立的容器,使用以下命令就可以进入
首先,开始这个容器

docker start 容器名(如上面的:f1a741044650)

然后,进入这个容器

docker attach 容器名(如上面的:f1a741044650)

进入容器后是这样:
python-打包exe-pyinstaller+docker-解决文件过大以及各类打包失败问题_第14张图片
此时,只需要按下任意键即可:
python-打包exe-pyinstaller+docker-解决文件过大以及各类打包失败问题_第15张图片
就是这样了,就可以使用3中各种pip、pyinstaller命令了!

总结

上述就是题主打包文件的流程和各种细节了,如果有问题可以在评论区评论,题主看到会及时回复。
本案例借鉴了CSDN上各位大佬的分享,再次感谢各位!其中主要借鉴了

https://blog.csdn.net/weixin_44424296/article/details/112078218
,非常感谢博主 各位观众全体起立的分享以及耐心解答!

你可能感兴趣的:(python技巧,python,docker,exe)