最近在用exchangelib连接公司内网邮箱,pycharm中成功通过运行,准备用Pyinstaller打包却遇到N个坑,写码很快2天完成,打包5天折腾,总算跑通,记录如下:
假如你的程序入口是manager.py

1、基本命令: pyinstaller manager.py。

,运行了这个命令,在目录下就会生产一个配置文件 manager.spec,非常重要,后续修改了这个配置文件,就直接执行 pyinstaller manager.spec了,这就是用修改的配置打包了。

2、问题:ModuleNotFoundError: No module named ‘xxx’,

pycharm 一直 updating indexes_配置文件


在build\manager\warm-manager.txt中也有体现

pycharm 一直 updating indexes_配置文件_02


这个问题,请先修改manager.spec文件,pathex=[‘F:\autoxtsj\venv\Lib\site-packages’,],这实际就是将你的库目录告诉pyinstaller,目录根据你的实际情况修改,特别特别注意,一定要双斜杠,双斜杠,我在这里折腾了半天。之后执行:pyinstaller manager.spec,再看是否成功。

pycharm 一直 updating indexes_pycharm_03


一般来说,这步完成后,通过import XXX的包是没问题了。

3、问题:继续显示丢失包。

这说明有些包是隐藏导入的,请仔细看cmd窗口显示的信息,提示是哪个文件出现问题,特别注意出问题文件的目录,如果问题文件是在python安装目录中的,必须要在安装目录下pip install XX,在程序虚拟环境下安装是不行的。这里忘了截图。

4、继续显示问题,请检查源码中引用 。

pycharm 一直 updating indexes_配置文件_04

请特别注意检查:程序需要引用的外部图片、音乐或ini文件是否已经放置到和exe同目录下面,否则程序取不到相关资源,当然报错。如上面报错,就是config.ini文件没有放置在目录中,导致configparser模块读到空值报错导致,其实即使在pycharm中如果没有这个.ini文件也一样报错。

5、继续显示问题,需要分析一下源码,看是否还引用了什么包没有导入。

pycharm 一直 updating indexes_pyinstaller_05


有些包因为使用了try…except机制,导致不会直接报程序源码中实际出问题是哪个包,要去源码看一下其实际引用的包,找到实际引用的包,放到manager.exe目录下测试。

比如上面的错误,就是由下面的代码导致,Pycharm中运行没问题,exe就报这个地方错误,通过分析代码,可以看到是使用了zoneinfo模块,果断找到zoneinfo包放到exe目录中去。

pycharm 一直 updating indexes_pycharm_06


如还继续显示问题,再继续分析源码,看是否还引用了什么包没有导入。比如上面我们放好了zoneinfo包后,前面的错误不见了,但又出现新错误(这是好事,说明前面的判断都没有问题)

pycharm 一直 updating indexes_pyinstaller_07


百度一下错误,有如下说明:

pycharm 一直 updating indexes_pycharm_08


显然上面说的解决问题的方法是 pip nstall 这个包,而我们在pycharm中能正常运行,显然是有这个包的,只是exe找不到这个包,那么我们找到这个包(不知道包在哪里?everything了解一下)复制到exe目录,继续测试吧…

6、如仍然有问题,看看你是不是使用的-F参数?用-D再试一试

有时候-F参数(onefile)打包成一个文件,在有引用库的时候总是出错,建议尝试默认的-D(目录模式)打包看看,我这次打包就遇到这个问题,去掉-F参数后,一切就正常了。

总体上就是这么几步,如果遇到一样坑的可以尝试逐个取排查吧。反正我成功了!!