PyInstaller 打包的 PySide6 应用程序无法加载 qtquick2plugin.dll

PyInstaller packed PySide6 application Cannot load qtquick2plugin.dll

我有一个 PySide6 + QML 应用程序要用 PyInstaller 打包到 exe 文件。

这是我的代码:

main.qml

import QtQuick
import QtQuick.Layouts
import QtQuick.Controls

ApplicationWindow {
    id: window
    title: "Motor"
    width: 500
    height: 600
    visible: true

    maximumHeight: height
    maximumWidth: width

    minimumHeight: height
    minimumWidth: width
}

main.py

from PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QQmlApplicationEngine

if __name__ == "__main__":
    import sys 
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine(parent=app)
  
    engine.load("main.qml")
    sys.exit(app.exec_())
    if not engine.rootObjects():
        sys.exit(-1)
    sys.exit(app.exec_())

motor.spec

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['main.py'],
             pathex=['E:\Projects\motor\GUI'],
             binaries=[],
             datas=[('main.qml', '.'), ('settings.ini', '.')],
             hiddenimports=['PySide6.QtCore', 'PySide6.QtGui', 'PySide6.QtQml'],
             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,
          [],
          exclude_binaries=True,
          name='MotorGUI',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               upx_exclude=[],
               name='MotorGUI')

pyinstaller motor.spec 打包后,我将 pluginsqmltranslations 文件夹从 python/site-pack/PySide6 文件夹复制到 exe 的 PySide6 文件夹。

当我运行 exe文件时,我得到:

QQmlApplicationEngin failed to load component
file:///E:/Projects/motor/GUI/dist/MotorGUI/main.qml:1:1: Cannot load library E:\Projects\motor\GUI\dist\MotorGUI\PySide6\qml\QtQuick\qtquick2plugin.dll

qtquick2plugin.dll确实存在。

我的python版本是3.8.6

PySide==6.0.0

pyinstaller==4.2

PyInstaller(截至 4.2)尚不支持 PySide6。

https://github.com/pyinstaller/pyinstaller/issues/5414

我找到了根本原因。缺少QT的dll

我通过将 pyside Qt 文件夹中的所有 .dll 文件复制到 exe 的文件夹来解决这个问题。

然后完美运行

之后,我手动删除了多余的dll,以确定最低要求。

最后在spec文件中添加dll