PyInstaller; “找不到或加载Qt平台插件“ Windows”

J. *_*Doe 6 qt pyinstaller static-linking python-3.x pyqt5

我的PyInstaller规格:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['test.py'],
             pathex=['C:\\Users\\admin\\compile'],
             binaries=[('C:\\Python361\\Lib\\site-packages\\PyQt5\\Qt\\plugins\\platforms\\qwindows.dll', 'qwindows.dll')],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)

pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='test',
          debug=False,
          strip=False,
          upx=False,
          runtime_tmpdir=None,
          console=False , icon='icon.ico')
Run Code Online (Sandbox Code Playgroud)

所以我遇到了一个问题,我将使用pip的最新版本的PyInstaller编译我的PyQt5 5.8.2(使用Python 3.6.1)程序,并且可以正常工作!静态链接的onefile可执行文件在我的计算机上可以运行所有Qt文件。

但是随后,我在尚未设置Qt环境的任何计算机或虚拟机上对其进行了测试,并且由于“找不到或加载Qt平台插件'windows'”错误而在启动时崩溃。如果您看一下规格,您会发现我尝试将DLL手动存储在二进制列表中,因此PyInstaller会将其存储在可执行文件中,但这没有用。

我想知道我需要更改什么,这样我才可以编译我的应用程序,而不必执行将可执行文件文件夹中的platform文件夹包括在内的操作(​​我希望所有内容都在可执行文件中),是否会如此简单?我没有意识到规范文件中的更改,以便将DLL存储在可执行文件中?

顺便说一句,这不是重复的。我查看了其他一些问题,所有这些问题要么针对不同类型的应用程序,要么解决方案是将DLL降级或存储在文件夹中,但我不能做任何一个。

编辑:所以我将其更改为onedir只是为了查看它是否甚至在其中,并且qwindows.dll在文件夹内。还有一个qt5_plugins文件夹,其中包含一个Platforms文件夹,其中也包含一个qwindows.dll。那怎么不检测dll呢?

tfv*_*tfv 8

似乎有两种解决方案,第一种对我来说效果很好:

  • 将平台目录复制到可执行文件的目录中。您将在类似的位置找到平台目录c:\Users\<username>\envs\<environmentname>\Library\plugins\platforms

  • 升级到较新版本的 pyqt: conda install -c anaconda pyqt

小心使用第二个选项:如果您有 conda 环境,请不要尝试使用 pip 进行 pyqt 安装,这可能会破坏您的 conda 安装:https : //github.com/ContinuumIO/anaconda-issues/issues/1970


小智 1

我刚刚将 pyqt5 包更新到 5.10.1 并修复了该问题。