PyInstaller/QtQuick:找不到 qmake 版本 5.x

PyInstaller / QtQuick: Could not find qmake version 5.x

Windows10、Python3.5、PyQt5是通过pip安装的,pyinstaller 3.2.1也是通过pip安装的。我可以制作一个小的 PyQt5 qml 应用程序,它在 运行 通常在 Python.

下工作正常

如果我有一个名为 test.py 的 Python 模块,其中包含:

from PyQt5.QtWidgets import QApplication
from PyQt5.QtQuick import QQuickView

并做:

pyinstaller main.py

我得到:

3452 ERROR: Could not find qmake version 5.x, make sure PATH is set correctly or try setting QT5DIR.
3452 ERROR: Cannot find QT_INSTALL_QML directory, "qmake -query QT_INSTALL_QML" returned nothing

其次是:

Traceback (most recent call last):
  File "C:\Python35\Scripts\pyinstaller-script.py", line 11, in <module>
    load_entry_point('PyInstaller==3.2.1', 'console_scripts', 'pyinstaller')()
  File "c:\python35\lib\site-packages\PyInstaller\__main__.py", line 90, in run
    run_build(pyi_config, spec_file, **vars(args))
  File "c:\python35\lib\site-packages\PyInstaller\__main__.py", line 46, in run_build
    PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
  File "c:\python35\lib\site-packages\PyInstaller\building\build_main.py", line 788, in main
    build(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build'))
  File "c:\python35\lib\site-packages\PyInstaller\building\build_main.py", line 734, in build
    exec(text, spec_namespace)
  File "<string>", line 16, in <module>
  File "c:\python35\lib\site-packages\PyInstaller\building\build_main.py", line 212, in __init__
    self.__postinit__()
  File "c:\python35\lib\site-packages\PyInstaller\building\datastruct.py", line 161, in __postinit__
    self.assemble()
  File "c:\python35\lib\site-packages\PyInstaller\building\build_main.py", line 470, in assemble
    module_hook.post_graph()
  File "c:\python35\lib\site-packages\PyInstaller\building\imphook.py", line 409, in post_graph
    self._load_hook_module()
  File "c:\python35\lib\site-packages\PyInstaller\building\imphook.py", line 390, in _load_hook_module
    attr_value = sanitizer_func(attr_value)
  File "c:\python35\lib\site-packages\PyInstaller\building\utils.py", line 466, in format_binaries_and_datas
    src_root_path_or_glob))
FileNotFoundError: Path or glob "Qt" not found or matches no files.

如果我注释掉 test.py 中的第二行(关于 QtQuick 的那一行),PyInstaller 会成功。

我无法将路径指向 qmake,因为我的机器上没有 qmake。我真的不明白为什么我需要qmake?

使用 Python 3.4.4 和 PyQt5 5.5.1(来自 https://sourceforge.net/projects/pyqt/files/PyQt5/PyQt-5.5.1/ - 我认为这是 3.4 的最后一个 PyQt5)和 PyInstaller 3.2.1 这一切都开箱即用.

我认为不同之处在于 Lib\site-packages\PyQt5 下的 PyQt5 目录结构在 3.4 和 3.5 之间有很大不同,我猜 PyInstaller 还没有处理这个问题。特别是,Python34 在 Lib\site-packages\PyQt5 的根目录中有 Qt5 二进制文件(Qt5Core.dll 等),而在 Python35 中它们最终隐藏在 Lib\site-packages\PyQt5\Qt\bin 下。还有很多其他差​​异。

无论如何,简单的答案是使用 Python34 / PyQt5.5.1。 FWIW 我有点让它与 Python35 和最新的 PyQt5 (5.8.1) 一起工作,但这是一个障碍。我同时安装了 Python34 和 Python35,并在我的 Windows 路径中安装了以下(按此顺序):

C:\Python35\
C:\Python35\Scripts\
C:\Python35\Lib\site-packages\PyQt5\Qt\bin
C:\Python34\Lib\site-packages\PyQt5

Python34 行必须在那里,否则我们会得到 Could not find qmake version 5.x 的东西,并且上面的 Python35\Lib\site-packages\PyQt5\Qt\bin 路径似乎使它获得了正确的二进制文件。

这样做,pyinstaller 报告成功,但是当我 运行 我得到一个关于 Cannot load library ... dist\main\qml\QtQuick\Controls\qtquickcontrolsplugin.dll: The specified procedure could not be found 的失败。这可以通过手动将 Python35\Lib\site-packages\PyQt5\Qt\qml\QtQuick\Controls\qtquickcontrolsplugin.dll 复制到 dist\main\qml\QtQuick\Controls 来解决。之后我的应用程序 运行s 符合预期。

我还没有找到让 pyinstaller 自动选择正确 qtquickcontrolsplugin.dll 的方法。

我想将 C:\Python34\Lib\site-packages\PyQt5 留在路径中可能会从 Python34 中拾取一些其他错误的文件,如果是这种情况,您可以手动复制它们或尝试 fiddle 使用路径等来尝试使正确的事情发生,但我将使用 Python34 直到 PyInstaller 得到修复。

我遇到了和你一样的问题。 但是,今天它可以使用这个补丁:https://github.com/pyinstaller/pyinstaller/pull/3233#issuecomment-362094587