错误:无法找到或加载Qt平台插件" windows" - PyQt + Pyinstaller

时间:2017-12-28 11:58:54

标签: python pyqt5 pyinstaller

我正在尝试使用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所在的位置。
    2. 但是,当我使用命令 - onefile 捆绑到单个文件时,此问题存在,并且在未设置 QT_QPA_PLATFORM_PLUGIN_PATH 的任何其他计算机上运行。

      有人可以帮助解决问题。

4 个答案:

答案 0 :(得分:0)

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

建议1(推荐):升级到pyinstaller v3.4。根据{{​​3}},已经解决了几个问题,特别是OP所指的问题。通常,现在对PyQt5的支持更好。

建议2 :此建议对我有用,但不建议使用。它可能对较旧版本的PyQt5有所帮助,或者如果您无法升级到pyinstaller 3.4:Python发行版的this pull request并将以下两项更改应用于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')

来源:Locate the site-packages directory,由用户shadchin撰写。

(我进一步建议使用python3.x。我很难为python 2.7.x捆绑PyQt5,但我不记得问题是在Windows还是macOS上发生的。)

答案 1 :(得分:0)

  

如果您使用 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的版本

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

答案 2 :(得分:0)

对于同样的问题,我也写了类似的答案,因为我也一直在努力解决这个问题。就像您尝试设置环境路径并复制文件夹一样(该文件夹可以工作,但必须手动完成。如果查看生成的.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实例 接收所有脚本,模块和二进制文件。

对于二进制文件,每个二进制文件应为具有两个值的元组:

第一个字符串指定文件所在的位置 现在的系统。第二个指定要包含的文件夹的名称 文件在运行时。

答案 3 :(得分:0)

我已经成功使用 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