一、问题背景

最近在运行一个基于 PyQt5 的 Python 图形界面项目时,程序启动失败,控制台提示无法找到 Qt 平台插件 `windows`。项目本身是一个桌面端可视化程序,使用 PyQt5 搭建界面,并通过 Python 命令启动主程序。

我的启动命令如下:

python MainProgram.py

运行后,控制台出现了如下报错信息:

qt.qpa.plugin: Could not find the Qt platform plugin "windows" in ""
This application failed to start because no Qt platform plugin could be initialized.
Reinstalling the application may fix this problem.

从报错信息可以看出,程序并不是 Python 语法错误,也不是代码逻辑错误,而是在启动 PyQt5 窗口时,Qt 没有正确找到 Windows 平台所需的插件文件,导致界面无法正常加载。

我的项目运行环境如下:

操作系统:Windows
Python版本:Python 3.10
项目环境:venv 虚拟环境
GUI框架:PyQt5
运行方式:PowerShell / CMD 执行 python MainProgram.py

这个问题在 PyQt5 项目中比较常见,尤其是在使用虚拟环境、重新安装依赖、PyQt5 版本不匹配,或者项目从其他电脑复制过来运行时,很容易出现。

二、报错原因分析

从表面上看,这个错误是在说程序找不到 Qt 的 windows 平台插件。实际上,它并不是普通的 Python 语法错误,也不是代码中的某个函数调用错误,而是 PyQt5 在启动图形界面时,底层 Qt 运行环境没有正确加载到对应的平台插件。

PyQt5 是 Python 对 Qt 框架的封装。当我们使用 PyQt5 创建窗口程序时,比如使用 QApplication、QMainWindow、QWidget 等组件,程序在真正显示窗口之前,需要先加载当前操作系统对应的 Qt 平台插件。

在 Windows 系统中,Qt 需要加载的核心平台插件通常是:

qwindows.dll

这个文件一般位于 PyQt5 的安装目录下,例如:

venv\Lib\site-packages\PyQt5\Qt5\plugins\platforms\qwindows.dll

有些环境中也可能是类似下面的路径:

venv\Lib\site-packages\PyQt5\Qt\plugins\platforms\qwindows.dll

其中,platforms 文件夹就是 Qt 平台插件目录,qwindows.dll 就是 Windows 平台下启动 PyQt5 窗口所需要的插件文件。

如果程序运行时没有找到这个文件,或者虽然文件存在,但是 PyQt5 没有定位到正确的插件目录,就会出现:

Could not find the Qt platform plugin "windows" in ""

这里的 "windows" 指的并不是 Windows 系统本身出错,而是 Qt 的 Windows 平台插件没有被正确加载。

结合实际项目运行情况,造成这个问题的原因通常有以下几种。

1. PyQt5 安装不完整

第一种常见原因是 PyQt5 安装不完整。

如果在安装 PyQt5 的过程中网络不稳定、安装被中断,或者部分依赖包没有正确下载,就可能导致 PyQt5 虽然表面上安装成功了,但是 Qt 相关的插件文件并没有完整安装。

这种情况下,项目中导入 PyQt5 时可能不会马上报错,例如下面的代码可能能够正常通过:


from PyQt5.QtWidgets import QApplication, QMainWindow

但是当程序真正创建窗口并启动事件循环时,就会因为缺少 Qt 平台插件而启动失败。

也就是说,PyQt5 的 Python 模块存在,不代表 Qt 的运行插件一定完整存在。

2. qwindows.dll 文件缺失

第二种原因是 qwindows.dll 文件本身缺失。

在 Windows 系统中,PyQt5 启动图形界面时需要依赖 qwindows.dll。如果这个文件不存在,程序自然无法启动窗口。

正常情况下,可以在项目虚拟环境中找到类似路径:

venv\Lib\site-packages\PyQt5\Qt5\plugins\platforms\qwindows.dll

如果打开 platforms 文件夹后发现里面没有 qwindows.dll,或者连 platforms 文件夹都不存在,就说明当前 PyQt5 环境可能存在问题。

这种情况一般可以通过重新安装 PyQt5 相关依赖解决。

3. PyQt5 插件路径没有被正确识别

第三种原因是插件文件其实存在,但是程序没有找到正确路径。

有时候 qwindows.dll 文件明明在本地环境中存在,但是程序启动时仍然提示找不到 windows 插件。这通常是因为 Qt 没有正确识别插件目录。

例如,Qt 原本应该从下面这个目录加载插件:

venv\Lib\site-packages\PyQt5\Qt5\plugins

但是由于环境变量、虚拟环境、IDE 配置或者路径异常等原因,程序启动时没有找到这个目录,于是就会报错。

报错中的这一段:

in ""

也比较关键。它表示 Qt 当前尝试查找插件的位置为空,或者没有拿到有效的插件路径。因此程序并不知道应该去哪里寻找 platforms/qwindows.dll

这类问题有时可以通过手动配置环境变量解决,例如配置:

QT_QPA_PLATFORM_PLUGIN_PATH

让程序明确知道 Qt 平台插件目录在哪里。

4. 虚拟环境路径异常

如果项目使用的是 venv 虚拟环境,也比较容易出现这个问题。

比如项目原本在一个路径下创建了虚拟环境,后来把项目整体复制到了另一个目录,或者从其他电脑拷贝了整个项目文件夹,虚拟环境内部的一些路径可能仍然指向旧位置。

这时候虽然你仍然可以激活虚拟环境,也可以执行:

python MainProgram.py

但是某些依赖包的内部路径可能已经不完全正确,导致 PyQt5 找不到 Qt 插件目录。

所以如果项目是从其他地方复制过来的,或者虚拟环境曾经被移动过,建议不要直接使用原来的 venv,而是重新创建虚拟环境并安装依赖。

5. PyQt5 与 pyqt5-plugins 版本冲突

第五种原因是 PyQt5 和 pyqt5-plugins 版本不匹配。

在一些 PyQt5 项目中,可能不仅安装了 PyQt5,还安装了 pyqt5-toolspyqt5-plugins 等扩展工具包。这些工具包对 PyQt5 的版本通常有严格要求。

例如,我之前遇到过类似下面的依赖冲突提示:

pyqt5-plugins 5.15.2.2.2 requires pyqt5==5.15.2,
but you have pyqt5 5.15.9 which is incompatible.

这句话的意思是:当前安装的 pyqt5-plugins 版本要求 PyQt5 必须是 5.15.2,但是环境中实际安装的是 PyQt5 5.15.9,两个版本不一致。

这种情况下,虽然程序中已经安装了 PyQt5,但是由于相关插件包和 PyQt5 主包版本不匹配,Qt 插件加载时仍然可能出现异常。

所以在排查这个问题时,不能只看有没有安装 PyQt5,还要看 PyQt5、PyQt5-Qt5、PyQt5-sip、pyqt5-plugins、pyqt5-tools 等包之间的版本是否兼容。

可以使用下面的命令查看当前环境中的相关包版本:

pip list | findstr PyQt

如果是 PowerShell,也可以使用:

pip list | Select-String PyQt

如果发现版本之间存在明显冲突,就需要重新安装匹配版本的 PyQt5 相关依赖。

6. IDE 或运行终端没有使用正确的 Python 环境

还有一种情况是,项目中其实已经安装好了 PyQt5,但是运行程序时使用的不是当前项目的虚拟环境,而是系统 Python 或其他 Python 环境。

比如项目依赖安装在:

项目目录\venv\

但是运行程序时,终端调用的却是系统 Python:

C:\Users\用户名\AppData\Local\Programs\Python\Python310\python.exe

这样就会导致程序实际运行环境和依赖安装环境不一致。

这种情况在 PyCharm、VS Code、CMD、PowerShell 混合使用时比较常见。比如在 PyCharm 里能运行,但在 PowerShell 里运行报错;或者在 PowerShell 里安装了依赖,但 PyCharm 运行时仍然报错。

因此,排查时需要确认当前终端使用的 Python 是否来自项目虚拟环境。可以使用下面命令查看:

where python

正常情况下,如果已经激活虚拟环境,优先显示的路径应该类似于:

项目路径\venv\Scripts\python.exe

如果显示的是系统 Python 路径,就说明当前没有使用项目虚拟环境。

7. 项目打包或复制后缺少 platforms 文件夹

如果项目经过 PyInstaller 等工具打包,也可能出现这个问题。

因为 PyQt5 项目打包时,不仅要打包 Python 代码,还需要把 Qt 的插件文件一起打包进去。尤其是 platforms 文件夹非常重要,其中的 qwindows.dll 是 Windows 平台窗口运行所需文件。

如果打包后的程序目录中缺少:

platforms\qwindows.dll

那么双击 exe 时也会出现类似报错。

同样,如果项目是从其他电脑复制过来的,只复制了 Python 代码,没有复制完整的虚拟环境或依赖文件,也可能导致插件文件缺失。

8. 系统环境变量中存在错误的 Qt 插件路径

有些电脑中可能安装过 Anaconda、Qt Creator、PyQt5、PySide2、PySide6 等多个 Qt 相关环境。如果系统环境变量中存在其他 Qt 版本的插件路径,程序运行时可能会错误地加载到不匹配的 Qt 插件。比如程序本来应该加载 PyQt5 自带的 qwindows.dll,但是由于环境变量影响,加载到了 Anaconda 或其他 Qt 环境中的插件文件,就可能因为版本不兼容导致启动失败。这种问题比较隐蔽,表现出来也可能是找不到插件,或者提示插件找到了但无法初始化。所以如果电脑中安装过多个 Python 环境、Anaconda 或 Qt 开发工具,也需要注意环境变量是否发生了冲突。

三、解决方法一:检查 qwindows.dll 是否存在

## 三、解决方法一:检查 qwindows.dll 是否存在

在排查这个问题时,首先不要急着重新安装所有依赖,而是先检查当前 PyQt5 环境中是否存在 Windows 平台插件文件,也就是 `qwindows.dll`。

因为这个报错的核心就是 Qt 没有正确加载到 `windows` 平台插件,所以第一步应该先确认这个插件文件到底有没有安装到本地环境中。

### 1. 找到当前项目的虚拟环境目录

如果项目使用的是虚拟环境,一般项目目录下会有一个 `venv` 文件夹,例如:

```text
项目目录
│
├── MainProgram.py
├── requirements.txt
├── venv
│   ├── Lib
│   ├── Scripts
│   └── pyvenv.cfg

我的项目是通过虚拟环境运行的,所以需要进入项目的 venv 目录中检查 PyQt5 的安装文件。一般情况下,PyQt5 的插件目录路径可能是下面这种:

venv\Lib\site-packages\PyQt5\Qt5\plugins\platforms

进入这个目录后,需要查看里面是否存在:

qwindows.dll

如果能找到 qwindows.dll,说明 Windows 平台插件文件本身是存在的,后续可以继续检查路径配置、环境变量或版本冲突。如果找不到 qwindows.dll,说明 PyQt5 的安装可能不完整,需要重新安装 PyQt5 相关依赖。


2. 手动检查 qwindows.dll 文件

可以直接在文件资源管理器中打开项目目录,然后按照下面路径逐级进入:

venv
 └── Lib
     └── site-packages
         └── PyQt5
             └── Qt5
                 └── plugins
                     └── platforms
                         └── qwindows.dll

完整路径示例:

D:\你的项目目录\venv\Lib\site-packages\PyQt5\Qt5\plugins\platforms\qwindows.dll

如果你的电脑中能够看到 qwindows.dll 文件,说明 PyQt5 的核心平台插件大概率是存在的。如果没有看到 Qt5 文件夹,也可以再检查下面这个路径:

venv\Lib\site-packages\PyQt5\Qt\plugins\platforms\qwindows.dll

不同版本的 PyQt5 目录结构可能略有差异,有些环境中是 Qt5 文件夹,有些环境中可能是 Qt 文件夹,所以可以两个路径都检查一下。


3. 使用命令查找 qwindows.dll

如果不想手动一层层打开文件夹,也可以在项目目录下使用命令查找。

在 CMD 中可以使用:

dir /s /b qwindows.dll

如果是在 PowerShell 中,可以使用:

Get-ChildItem -Recurse -Filter qwindows.dll

如果文件存在,终端会输出类似下面的路径:

D:\你的项目目录\venv\Lib\site-packages\PyQt5\Qt5\plugins\platforms\qwindows.dll

如果没有任何输出,说明当前项目环境中可能没有找到 qwindows.dll 文件。


4. 判断检查结果

检查完成后,一般会出现两种情况。

情况一:qwindows.dll 存在

如果 qwindows.dll 文件存在,但是运行程序时仍然报错:

qt.qpa.plugin: Could not find the Qt platform plugin "windows" in ""

说明问题不一定是文件缺失,而可能是 PyQt5 没有正确识别插件目录。

这种情况下,后面可以继续检查:

1. 当前运行的 Python 是否是项目虚拟环境中的 Python
2. QT_QPA_PLATFORM_PLUGIN_PATH 环境变量是否配置正确
3. PyQt5、PyQt5-Qt5、PyQt5-sip、pyqt5-plugins 版本是否冲突
4. IDE 或终端是否使用了错误的解释器

也就是说,qwindows.dll 存在只能说明插件文件没有丢失,但不能保证程序一定能找到它。

情况二:qwindows.dll 不存在

如果没有找到 qwindows.dll,或者连 platforms 文件夹都不存在,说明当前 PyQt5 环境很可能安装不完整。

这种情况通常需要重新安装 PyQt5 相关依赖。可以先卸载原有 PyQt5:

pip uninstall PyQt5 PyQt5-Qt5 PyQt5-sip -y

然后重新安装:

pip install PyQt5

如果网络不稳定,可以使用国内镜像源安装:

pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple

安装完成后,再次检查下面路径是否出现 qwindows.dll

venv\Lib\site-packages\PyQt5\Qt5\plugins\platforms\qwindows.dll

如果重新安装后该文件出现,说明插件已经补全,可以再次运行项目测试。


5. 注意不要只检查系统 Python

这里需要特别注意:如果项目使用的是虚拟环境,一定要检查当前项目 venv 里面的 PyQt5,而不是只检查系统 Python 目录。

比如有些电脑中可能同时存在多个 Python 环境:

C:\Users\用户名\AppData\Local\Programs\Python\Python310
D:\项目目录\venv
Anaconda 环境
其他项目的虚拟环境

如果你只在系统 Python 中找到了 qwindows.dll,但是项目运行时使用的是 venv,那么系统 Python 中的插件文件对当前项目并没有作用。

因此,检查时要确保路径属于当前项目正在使用的 Python 环境。

可以使用下面命令确认当前终端使用的是哪个 Python:

where python

如果已经激活虚拟环境,正常情况下应该优先显示类似下面的路径:

D:\你的项目目录\venv\Scripts\python.exe

如果显示的是系统 Python 路径,例如:

C:\Users\用户名\AppData\Local\Programs\Python\Python310\python.exe

说明当前终端可能没有正确进入虚拟环境。


6. 本步骤小结

这一部分主要是确认 PyQt5 的 Windows 平台插件文件是否存在。

重点检查文件是:

qwindows.dll

重点检查目录是:

venv\Lib\site-packages\PyQt5\Qt5\plugins\platforms

如果 qwindows.dll 不存在,优先考虑重新安装 PyQt5。如果 qwindows.dll 存在,但程序仍然报错,则继续排查 Python 环境、插件路径、环境变量和版本冲突等问题。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐