【问题标题】:Error: Could not find or load the Qt platform plugin "windows" - PyQt + Pyinstaller错误:无法找到或加载 Qt 平台插件“windows” - PyQt + Pyinstaller
【发布时间】:2018-06-08 23:30:18
【问题描述】:

我正在尝试使用 Pyinstaller 捆绑 PyQt 项目。我尝试使用命令pyinstaller --onedir Hello.py 创建包。

这将创建 dist 文件夹并具有 Hello.exe。运行时出现错误:此应用程序无法启动,因为它无法在“”中找到或加载 Qt 平台插件“windows”。 重新安装应用程序可能会解决此问题。

我在我的电脑上解决了这个问题

  1. 设置环境变量QT_QPA_PLATFORM_PLUGIN_PATH

或通过

  1. dist\Hello\PyQt5\Qt\plugins\platform 文件夹复制到Hello.exe 所在的位置。

但是,当我使用命令 --onefile 捆绑到单个文件并在未设置 QT_QPA_PLATFORM_PLUGIN_PATH 的任何其他机器上运行时,就会出现此问题。

谁能帮忙解决这个问题。

【问题讨论】:

  • 非常感谢您发布这个问题 - 我遵循了您的“第 2 步”。并解决了我被困了几个小时的问题

标签: python pyqt5 pyinstaller


【解决方案1】:

这是很多人(包括我自己)都在努力解决的问题。参见例如this bug report

建议 1(推荐):升级到 pyinstaller v3.4。根据this pull request 的说法,已经解决了几个问题,尤其是 OP 所指的问题。现在对 PyQt5 的支持普遍更好。

建议 2:这个对我有用,但不推荐。它可能有助于旧版本的 PyQt5 或者如果您无法升级到 pyinstaller 3.4:您的 python 发行版的Locate the site-packages directory 并将以下两个更改应用于 PyInstaller 模块:

Edit 1: PyInstaller/loader/rthooks.dat
-    'PyQt5':      ['pyi_rth_qt5.py'],
+    'PyQt5':      ['pyi_rth_qt5.py', 'pyi_rth_qt5plugins.py'],
Edit 2: PyInstaller/utils/hooks/qt.py
-    elif namespace == 'PyQt5':
-        plugin_dir = os.path.join('PyQt5', 'Qt', 'plugins')

来源:see pull request #2991 用户 shadchin。

(我进一步推荐使用 python 3.x。我努力为 python 2.7.x 成功捆绑 PyQt5,但我不记得问题是出现在 windows 还是 macOS 上。)

【讨论】:

    【解决方案2】:

    如果您使用 python 3.4 并且 pip 拒绝安装 pyqt5

    下载安装

    Pyqt5 手动到 %你的 python 3.4 目录%

    创建目录

    %your python 3.4 dir%\Lib\site-packages\PyQt5创建目录Qt然后move plugins folder那里。

    添加插件

    然后您可以将('C:/Python34-32/Lib/site-packages/PyQt5/Qt/plugins', 'PyQt5/Qt/plugins') 添加到您的规范文件中的数据中。

    请务必下载 PyQt 5.4.1 或其他支持 python 3.4 的版本

    至少这解决了我的问题。我希望这会对某人有所帮助

    【讨论】:

      【解决方案3】:

      我为同样的问题写了一个类似的答案,因为我也一直在努力解决这个问题。就像您一样,我尝试设置环境路径并复制文件夹(这有效,但必须再次手动完成。如果您查看生成的 .spec 文件的顶部,您会看到 mode: python 这样给了我一个如下所示:

      # -*- mode: python ; coding: utf-8 -*-
      
      block_cipher = None
      
      pf_foldr='C:\\Users\\Gabryxx7\\anaconda3\\envs\\<env_name>\\Library\\plugins\\platforms\\'
      
      a = Analysis(['C:\\Users\\Gabryxx7\\PycharmProjects\\<proj_name>\\program.py'],
                   pathex=['C:\\Users\\Gabryxx7\\PycharmProjects\\<proj_name>\\'],
                   binaries=[(pf_foldr+'qwindows.dll', 'platforms\\qwindows.dll'),
                   (pf_foldr+'qdirect2d.dll', 'platforms\\qdirect.dll'),
                   (pf_foldr+'qoffscreen.dll', 'platforms\\qoffscreen.dll'),
                   (pf_foldr+'qwebgl.dll', 'platforms\\qwebgl.dll')
                   ],
                   datas=[],
                   hiddenimports=['GUI', 'API', 'Threading', 'ssl', 'pyodbc'],
                   hookspath=[],
                   runtime_hooks=[],
                   excludes=[],
                   win_no_prefer_redirects=False,
                   win_private_assemblies=False,
                   cipher=block_cipher,
                   noarchive=False)
      pyz = PYZ(a.pure, a.zipped_data,
                   cipher=block_cipher)
      exe = EXE(pyz,
                a.scripts,
                a.binaries,
                a.zipfiles,
                a.datas,
                [],
                name='programName',
                debug=False,
                bootloader_ignore_signals=False,
                strip=False,
                upx=True,
                upx_exclude=[],
                runtime_tmpdir=None,
                console=True ) # False to avoid the console
      

      这是--one-file 规范的示例。正如文档上所说:https://pyinstaller.readthedocs.io/en/stable/spec-files.html

      在单文件模式下,没有对 COLLECT 的调用,并且 EXE 实例 接收所有脚本、模块和二进制文件。

      对于二进制文件,每个二进制文件应该是一个包含两个值的元组:

      第一个字符串指定文件或文件,因为它们在此 现在系统。第二个指定要包含的文件夹的名称 运行时的文件。

      【讨论】:

        【解决方案4】:

        我已经成功使用 auto-py-to-exe,它会根据您选择的选项自动构建 pyinstaller 的命令:

        pip install auto-py-to-exe
        

        然后使用它:

        auto-py-to-exe
        

        文档:https://pypi.org/project/auto-py-to-exe/

        存档文档:https://archive.ph/2Cw0x

        【讨论】:

          最近更新 更多