解决Pyinstaller打包numpy和pandas库文件过大问题

解决Pyinstaller压缩numpy和pandas库文件过大问题


    今天是2021年的第一天,先祝各位小伙伴现年快乐哈。最近因为做了一个项目,需要打包文件,文件中包含了numpy和pandas库,结果打包出来几百行的代码居然要900m,人都傻了,翻遍了全网找解决方法都搞不定,最后经过大佬的指点,在docker下解决了打包文件过大的问题,最终打包30m,因此记录下流程,希望对各位遇到同样的问题能有帮助。

文件包类型和网上的方法

import pandas as pd
import numpy as np
import time
import math
import warnings
warnings.filterwarnings('ignore')
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
from tkinter import filedialog
from PIL import ImageTk, Image
import re

    这是我项目中导入的库,其中有numpy和pandas这两个量级的工具包(目前网上有说pandas和numpy是不能打包的,实际上并不是这样的),直接在cmd下切入到项目的路径下,输入:

pyinstaller -F main.py

进行打包,其中打包的格式可以参照这篇文章,比较详细的介绍了如何打包。打包等了n久,还出现在递归溢出…不过这个不是重点,通过百度解决了溢出问题最终打包出来的结果居然有900+m,人都傻了。
    通过不断地百度,在这篇文章下面找到了使用pipenv环境进行打包,具体的直接打包文件过大是因为使用pyinstaller会打包anaconda里面一些无关的包,因此弄的文件很大,要压缩大小就需要一个“干净”的环境,pipenv就提供了这样的环境。不过按着pipenv打包,打包出来的结果有200+m,虽然压缩了一大堆,但是结果还是不够满意,具体为什么我也不太清楚,讲道理有一个新虚拟的环境应该不会打包这么大的,如果有大佬知道为什么可以在评论区留言讨论一下。下图是我的pipenv中的环境:
在这里插入图片描述
    后面在某大佬的指点下使用的docker进行打包,效果出奇的好,因此建议使用docker进行打包。

Windows下docker的安装

Windows下如何安装docker
    怎么安装我就不重复了,参照上面的文章按步骤来就好,这里有个问题,我的电脑没有Hyper-v,因此需要安装一个,步骤如下:

1.将如下代码添加到记事本中,并另存为Hyper-V.cmd文件。代码如下:
pushd “%~dp0”
dir /b %SystemRoot%\servicing\Packages*Hyper-V*.mum >hyper-v.txt
for /f %%i in (‘findstr /i . hyper-v.txt 2^>nul’) do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL
2.右键Hyper-V.cmd文件以管理员方式运行,然后等待重启即可生效

    有了Hyper-v,运行了docker,结果出现了这个

System.InvalidOperationException:
Failed to set version to docker-desktop: exit code: -1
stderr:
在 Docker.ApiServices.WSL2.WslShortLivedCommandResult.LogAndThrowIfUnexpectedExitCode(String prefix, ILogger log, Int32 expectedExitCode) 位置 C:\workspaces\PR-15077\src\github.com\docker\pinata\win\src\Docker.ApiServices\WSL2\WslCommand.cs:行号 146
在 Docker.Engines.WSL2.WSL2Provisioning.d__8.MoveNext() 位置 C:\workspaces\PR-15077\src\github.com\docker\pinata\win\src\Docker.Desktop\Engines\WSL2\WSL2Provisioning.cs:行号 82
— 引发异常的上一位置中堆栈跟踪的末尾 —
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
在 Docker.Engines.WSL2.LinuxWSL2Engine.d__25.MoveNext() 位置 C:\workspaces\PR-15077\src\github.com\docker\pinata\win\src\Docker.Desktop\Engines\WSL2\LinuxWSL2Engine.cs:行号 99
— 引发异常的上一位置中堆栈跟踪的末尾 —
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
在 Docker.ApiServices.StateMachines.TaskExtensions.d__0.MoveNext() 位置 C:\workspaces\PR-15077\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\TaskExtensions.cs:行号 29
— 引发异常的上一位置中堆栈跟踪的末尾 —
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
在 Docker.ApiServices.StateMachines.StartTransition.d__5.MoveNext() 位置 C:\workspaces\PR-15077\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\StartTransition.cs:行号 67
— 引发异常的上一位置中堆栈跟踪的末尾 —
在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
在 Docker.ApiServices.StateMachines.StartTransition.d__5.MoveNext() 位置 C:\workspaces\PR-15077\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\StartTransition.cs:行号 92

解决方法:
管理员方式执行cmd命令

netsh winsock reset

重启后,docker就可以正常启动啦。
在这里插入图片描述
运行docker也很简单,接盘上按win+R进入运行界面,输入powershell进入windows powershell,输入

docker --version

可以查看docker的版本,输入

docker pull hello-world

拉下镜像,然后输入

docker run hello-world

如果一切正常说明docker成功安装,这些操作都和在linux系统一样的。

在docker下实现打包

    在docker下实现打包,需要用到docker镜像,具体搜镜像可以去docker hub里面搜,pyinstaller的镜像网站:https://hub.docker.com/r/cdrx/pyinstaller-windows
直接在powershell下输入

docker pull cdrx/pyinstaller-windows

拉下镜像后,创建container,记得挂载主机!!!

docker run -it -v D:/PyCharm/project/pack:/home/ cdrx/pyinstaller-windows   /bin/bash

其中:

  • D:/PyCharm/project/pack 是我文件的目录,大家按自己文件的目录改一下就好了
  • /home/ 是docker下的对应的目录

运行完后container就创建好了,输入

pip list

看下docker下的环境包吧。
在这里插入图片描述
原装包真的少,然后安装你需要的包,我导入的库有pandas、numpy、还有tkinter,因此需要安装几个包,运行pip安装:

# 最好对应主机的库版本
pip install numpy==1.16.4
pip install pandas==1.0.5
pip install Pillow

然后输入

pyinstaller -F main.py

打包,结果很喜人,只有30m,但是运行程序报错,这时候你就看看缺什么包就补什么包吧。
最终我安装的包如下:
在这里插入图片描述
最终程序可以执行,如果不想要黑黑的cmd弹窗的话,就在打包时候把-F改成-w吧,这样的话打包结果为80m左右,也很不错了。

  • 10
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值