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
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