pyinstaller打包程序所遇问题记录

pyinstaller支持的参数功能

pyinstaller打包程序所遇问题记录_第1张图片
命令样式:
pyinstaller -w -i “d:\my.ico” -F mypy.py

python pyinstaller RecursionError: maximum recursion depth exceeded

在调用pyinstaller -F my.py 时报错如下:

递归超过了python的栈高度限制

  File "F:\Program_File\anaconda3\lib\ast.py", line 263, in generic_visit
    self.visit(value)
  File "F:\Program_File\anaconda3\lib\ast.py", line 253, in visit
    return visitor(node)
RecursionError: maximum recursion depth exceeded

解决方案

stackoverflow网友解决方案

Mustafa did guide me to the right direction, you have to increase the recursion limit. But the code has to be put to the beginning of the spec file and not in your python code:

import sys
sys.setrecursionlimit(5000)

Create the spec file with pyi-makespec first, edit it and then build by passing the spec file to the pyinstaller command. See the pyinstaller manual for more information about using spec files.

Please make sure to use pyinstaller 3.2.0, with 3.2.1 you will get ImportError: cannot import name ‘is_module_satisfies’ (see the issue on GitHub)

在此总结下解决步骤:
1)pyinstaller -F xxx.py
这一步肯定会报上述错误导致失败,但是会产生一个xxx.spec文件
2)在xxx.spec文件中增加两行(添加在原文件第二行):

import sys
sys.setrecursionlimit(5000)

再执行 pyinstaller xxx.spec 打包成功。

python pyinstaller Cannot find existing PyQt5 plugin directories

问题现象

Exception:
            Cannot find existing PyQt5 plugin directories
            Paths checked: C:/qt64/qt_1544645195969/_h_env/Library/plugins

解决方案

网友方案
I solved it by copying the pyqt5qmlplugin.dll to the path mentioned above C:/qt64/qt_1544645195969/_h_env/Library/plugins. Finally I got the .exe
意思就是:

  1. 手动创建C:/qt64/qt_1544645195969/_h_env/Library/plugins这个目录,
  2. 然后从anaconda下找到pyqt5qmlplugin.dll 这个库拷贝进去

在这里插入图片描述

python pyinstaller ‘utf-8’ codec can’t decode byte 0xce in position 123: invalid continuation byte

问题现象

----------------------------------------
'utf-8' codec can't decode byte 0xce in position 123: invalid continuation byte
These are the bytes around the offending byte:

解决方案

思路:编码格式问题(可直接解决问题)

  1. 改变控制台的编码格式为utf-8 解决方法,先在控制台中输入 chcp 65001切换控制台编码格式,再执行打包命令

如果还不行:
尝试将中文解释都去掉

python pyinstaller打包程序启动失败

现象

This application failed to start because it could not find or load the Qt platform plugin “windows”.

解决方案

吧这个文件夹,拷贝到执行程序同目录即可:
如果是anaconda环境,
c:\Program_File\anaconda3\Library\plugins\platforms

如果是python 环境:
C:\Python33\Lib\site-packages\PyQt5\plugins\platforms

pyinstaller打包程序exe过大(exe 300多M)

这个问题纠结了我两天,最终解决了

问题根源

  • 大部分是因为我们使用anaconda,然后包了一些库,例如 xlwings,openxl等包完,不用说直接上300M以上
  • 原因是anaconda库的关联关系太复杂,打包程序pyinstaller默认把相关的全部打包进去了
  • pyinstaller打包程序所遇问题记录_第2张图片

解决方法

  • 最好用的办法就是新建python venv,在新的环境下去打包
  • 新建方法参考我另一篇博文: 如何新建python venv
  • 新建后,调用pyinstaller 打包,所调用的库、包都是新建的venv中的,和anaconda无关了
(venv) D:\pyvenv_a\venv>pyinstaller -F pyexcel\RWExcel.py pyexcel\operfile.py
......
1135 INFO: Bootloader d:\pyvenv_a\venv\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.exe
21135 INFO: checking EXE
21139 INFO: Building because toc changed
21140 INFO: Building EXE from EXE-00.toc
21141 INFO: Appending archive to EXE D:\pyvenv_a\venv\dist\RWExcel.exe
21169 INFO: Building EXE from EXE-00.toc completed successfully.

新建venv打包结果:

已经很小了,40M左右,(本身里边包含python解析器信息,基本都会大于10M)
pyinstaller打包程序所遇问题记录_第3张图片

顺带解决上述三问题

  1. 上述描述的三个问题,也随之不见了,意外中都被解决了

结论

  1. 解决以上所有问题,最好的版本就是新建python venv,基本能隔离很多问题
  2. 我们同时也可以推断出来,编码错误、堆栈到达上线等问题都是anaconda依赖库导致的间接问题,anaconda在给我们带来方便的同时,也挖了不少坑

你可能感兴趣的:(python)