pyinstaller打包程序所遇到的所有问题:Linux和windows环境下

本文介绍了Python使用PyInstaller的打包命令,如 -F 生成单个可执行文件、-w 消除控制台窗口。还讲述了Linux环境下打包较顺利,而Windows环境下会遇到诸多问题,如递归层数超限、找不到插件目录等,并针对每个问题给出了相应的解决方案。
部署运行你感兴趣的模型镜像

打包命令

pyinstaller -Fw XXXX.py
其中 -F 表示只生成单个的可执行文件,否则会生成大量的其他文件。一般会选择 -F 选项。
-w选项,表示消除控制台窗口,不加就会在运行程序的同时打开一个控制台。

Linux环境下的打包

基于Ubuntu下的pyinstaller程序打包比较顺利,没有问题。由于需要在windows下运行程序,因此不得不在windows下面也打包程序,然而,却遇到了很多问题。

windows环境下打包

不得不说,在windows下面的问题还是蛮多的,下面按照顺序一一解答所遇到的问题。

python pyinstaller RecursionError:maximum recursion depth exceeded。

错误原因:打包过程中,递归层数超过限制。
解决方案:按照下面的步骤:

  1. 控制台输入pyinstaller -Fw XXX.py,等等打包出错。
  2. 找到 XXX.spec文件,在文件的第二行开始添加下面两行:
    import sys
    sys.setrecursionlimit(5000) # 5000表示运行递归的层数,可自行修改
  3. 控制台输入 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/**

解决方案

  1. 手动创建错误信息中提示的路径,比如上面的错误信息就是要建立:
    C:/qt64/qt_1544645195969/_h_env/Library/plugins/
  2. 从anaconda安装位置下面搜索pyqt5qmlplugin.dll 这个文件,拷贝到上述的目录下。如果你不是使用的anaconda环境,或者找不到,最简单的办法就是在你觉得可能的目录下面搜索pyqt5qmlplugin.dll

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

错误原因:编码格式不对,很大可能是你的程序是从linux环境下复制下来的。
解决方案

  1. (pychram)控制台输入 chcp 65001 ,如果不是pychram的IDE,试试这个命令是否有效吧
  2. 终结方法是将程序中的所有中文注释删除

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

错误原因:windows平台的弊端吧,反正Linux下没这些毛病。
解决方案

  1. 如果你是使用的anaconda,就到其安装目录下搜索platforms目录(有可能会找到很多个,一个个试试)。
  2. 如果你是普通python环境,反正就是到相关目录下搜索platfroms ,一个个试试。

最后一个问题,就是你的程序过大,打包失败。

错误原因:使用了anaconda,依赖包太多,所以比较大。
解决方案:新建一个环境,怎么建立,见链接:

https://blog.youkuaiyun.com/wskzgz/article/details/88993910

好了,就是这样,我在打包过程中,遇到了上面所有问题,花了半天一夜才全部解决。

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要帮助用户解决PyInstaller打包后出现的ModuleNotFoundError问题。根据用户提供的引用内容,我需要整理出可能的原因对应的解决方案。 首先,用户提到的错误是打包后的exe运行时提示找不到某个模块,比如mmcv._ext、keyboard等。根据引用[1]、[2]、[3]、[4],可能的原因有几个: 1. **隐藏导入问题**:有些模块是动态导入的,PyInstaller可能无法自动检测到,导致打包时遗漏。例如引用[3]中的mmcv._ext可能需要手动指定隐藏导入。 2. **虚拟环境配置问题**:用户可能在虚拟环境中运行打包命令,但PyInstaller调用了全局环境的包,导致依赖缺失。引用[4]提到如果在虚拟环境中未安装PyInstaller,使用全局的PyInstaller可能无法正确识别虚拟环境中的依赖。 3. **第三方模块的特殊处理**:某些模块如keyboard可能有特定依赖或需要额外数据文件。引用[2]中的例子显示需要将数据文件包含进去。 4. **路径问题**:打包后的程序可能在运行时找不到模块的路径,尤其是在使用相对路径时。需要检查代码中的路径引用是否正确。 接下来,我需要将这些原因转化为解决方案,并按照用户要求的结构清晰呈现。需要确保使用中文,并且正确应用行内公式独立公式的格式。不过在这个问题中,可能数学公式较少,但如果有提及算法或数学相关内容时需要注意。 用户可能还需要生成相关问题,我需要考虑用户可能进一步会问的问题,比如如何调试、特定模块的处理等。 现在,我需要整理解决方案的步骤,并引用相关的引用内容作为支持。例如,手动添加隐藏导入可以使用--hidden-import参数,这在引用[3]中提到。虚拟环境问题在引用[4]中解释,需要确保在正确的环境中安装PyInstaller依赖。 此外,用户可能需要检查打包日志,确认所有模块是否被正确包含,这需要指导用户如何分析日志文件。数据文件的问题需要用到--add-data参数,如引用[2]中的处理方式。 最后,确保回答结构清晰,分步骤说明,并且每个步骤都有对应的解决方法示例命令。同时,生成的相关问题需要围绕用户可能遇到的后续疑问展开,比如特定错误处理、优化打包体积等。</think>### PyInstaller打包后ModuleNotFoundError解决方案 #### 一、问题根源分析 当PyInstaller打包后出现$ModuleNotFoundError$,主要成因可归纳为: 1. **动态导入模块未识别**:例如使用`__import__()`或`importlib`动态加载的模块[^3] 2. **虚拟环境配置异常**:打包时未使用项目对应虚拟环境PyInstaller[^4] 3. **特殊依赖处理缺失**:如C扩展模块(mmcv._ext)、系统级依赖(keyboard)等[^2][^3] 4. **路径引用方式错误**:打包程序工作目录与开发环境不一致 #### 二、系统级解决方案 ```bash # 确保在项目虚拟环境中操作 source venv/bin/activate # Linux/Mac venv\Scripts\activate # Windows # 安装正确版本的PyInstaller pip install pyinstaller==5.6.2 ``` #### 三、具体处理步骤 1. **强制包含隐藏模块** ```bash pyinstaller --hidden-import=mmcv._ext --hidden-import=keyboard your_script.py ``` 使用`--hidden-import`参数显式声明动态加载模块(适用于mmcv._ext等特殊模块)[^3] 2. **包含数据文件(示例处理键盘模块)** ```bash pyinstaller --add-data="venv/Lib/site-packages/keyboard;keyboard" your_script.py ``` Windows系统使用分号分隔路径,Linux/Mac使用冒号 3. **路径规范化改造** 原始代码: ```python from utils import helper # 相对路径导入 ``` 应改为: ```python import os import sys sys.path.append(os.path.dirname(sys.executable)) from utils import helper ``` 4. **依赖树验证方法** ```bash pyinstaller --debug=imports your_script.py 2> import_errors.log ``` 通过分析日志文件定位缺失模块[^3] #### 四、高级调试方案 1. **依赖分析公式** 设程序总依赖集为$M = M_a \cup M_h \cup M_d$,其中: - $M_a$ = 自动检测模块集 - $M_h$ = 手动声明模块集 - $M_d$ = 动态加载模块集 当出现$m_i \notin M$时即触发$ModuleNotFoundError$ 2. **打包验证矩阵** | 验证项 | 检测命令 | 预期输出 | |----------------|----------------------------|----------------------| | 基础依赖完整性 | `./dist/your_script --help` | 正常显示帮助信息 | | 特殊功能验证 | 执行核心业务函数 | 返回标准结果集 | | 路径兼容性 | 在不同目录层级执行程序 | 保持功能一致性 | #### 五、典型错误处理示例 **案例:缺失mmcv._ext模块** ```bash # 解决方案分步实施 1. 确认mmcv安装完整:pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/{cu_version}/{torch_version}/index.html 2. 添加隐藏导入:--hidden-import=mmcv._ext 3. 包含编译文件:--add-binary="venv/lib/mmcv/_ext.cpython-38-x86_64-linux-gnu.so;mmcv" ``` 此方案通过组合命令解决模块加载问题[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值