用pyinstaller打包python遇到的坑

最近写了一个小程序,用到了pandas,matplotlib模块,打包时出现各种问题,总结下走过的坑。
因为之前使用openpyxl写过一个更简单的程序,仅用来读写excel,打包的时候遇到过打包后文件太大,打包后文件200MB!可以参考下面的文章解决,
Python打包exe文件方法汇总【4种】
在虚拟环境下打包,文件瘦身十分有效,仅10MB大小,
值得注意的是:

  1. pipenv shell激活虚拟环境
  2. pip installer pyinstaller,需要在虚拟环境下安装pyinstaller,若未安装直接使用pyinstaller,仍然会将实际环境下的所有包一股脑打包到exe程序中。
  3. pip list可以查看虚拟环境下安装了哪些包
  4. pip clean 当无法分别装的太多包是否多余,可以使用该指令全部清除。
  5. python program.py 为了有效检查哪些包是需要的,强烈建议在虚拟环境中运行python程序,提示缺什么就装什么。
C:\Users\Administrator\Desktop\123>python V1.py
Traceback (most recent call last):
  File "V1.py", line 9, in 
    from pandas import read_excel,ExcelWriter,DataFrame,concat
ModuleNotFoundError: No module named 'pandas'

C:\Users\Administrator\Desktop\123>pip install pandas

鉴于之前的经验,本以为这次打包会很顺利,结果被啪啪大脸,事实证明这是一个不断踩坑的过程。
**问题一:RecursionError: maximum recursion depth exceeded in comparison
**解决方法pyinstaller打包报错: RecursionError: maximum recursion depth exceeded,UnicodeDecodeError

同样的打包方法,公司电脑会有递归深度超限报错,而自己的电脑却不会报错,怀疑是和计算机程序位数有关。

问题二: ModuleNotFoundError :No module named ‘distutils’
用pyinstaller打包python遇到的坑_第1张图片
看到缺少模块,第一反应直接pip install distutils,谁知直接报错,没有此模块名!
继续搜索寻找答案…
pyinstaller打包成功后提示ModuleNotFoundError: No module named 'distutils’错误解决办法

按照这个方法试了一下,问题解决,发现不同版本的模块的兼容性真是令人堪忧。
当然看到其他解决方法例如:
在.spec文件中,将hiddenimports=[]改为hiddenimports=[‘distutils’]
感兴趣的可以尝试对比。

但同样使用工作笔记本,这个降版本方法不是有效,令人困惑。工作笔记本因公司设置权限问题比较麻烦,家用笔记本就可以解决这个问题。

问题三:打包后文件仍然巨大!
未使用虚拟环境打包,exe程序巨大,几百MB。

  1. 切换使用虚拟环境打包,exe程序仍然十分巨大,还是几百MB。
  2. 找了些类似问题,应该是pandas库过大导致,好吧,修改程序,类似于import pandas as pd 等语句均改为from pandas import read_csv,避免出现将整个模块语句打包进程序。再次打包,还是没有效果。
  3. 使用cmd的管理员和非管理员权限打包,没有任何区别
  4. 考虑到系统安装了Anaconda,因为知道这是一个相当于集合了python和各种库的软件,会不会是因为它?
    win10+anaconda3+pyinstaller生成exe文件太大的解决办法(血泪教训换来的)
    好吧,继续安装步骤来,在anaconda中新建一个虚拟环境,然后打包,仍然没有效果!很崩溃。
  5. 继续思考,既然怎么打包都会有不相干的模块被拖进来,那我干脆把你们全部从电脑中删除,彻底删除,也不管虚拟环境了,直接卸载anaconda,pycharm。进入python官网,找到python3.7,没有下3.8版,深刻体会到各版本的稳定性不一致,还是下3.7比较保险。python官网在这里插入图片描述
    重新安装python,添加环境变量。先检查了一遍,看最开始有多少模块在这里面
C:\Windows\system32>pip list
Package    Version
---------- -------
pip        19.2.3
setuptools 41.2.0
WARNING: You are using pip version 19.2.3, however version 19.3.1 is available.
You should consider upgrading via the 'python -m pip install --upgrade pip' command.

居然只有pip和setuptools在里面,果然很纯净。然后安装pyinstaller,安装pandas,安装matplolib,运行python程序,继续安装需要模块,直到程序可以正常运行,然后pyinstaller -F program.py。大小为38MB,已经可以达到我的需求了。
在这里插入图片描述

Pandas等库在Anaconda环境下打包巨大的解决方法

到此,至少这次打包算是成功了,但仍然比较困惑的点有:

  1. pandas这个库应该如何打包,才能有效减小程序大小?搜了一圈,没有找到直接的方法,目前我能想到笨方法的就是按照纯净的pandas库,可以在电脑装个虚拟机,专门打包用。
  2. 为什么进入虚拟环境后,打包仍然会有不想干的模块被封装进程序?

希望有大神指导!

你可能感兴趣的:(Python学习)