我正在尝试使用Pyinstaller捆绑PyQt项目。我尝试使用命令pyinstaller --onedir Hello.py
创建包。
这会创建dist文件夹并具有 Hello.exe 。运行时会出现错误:此应用程序无法启动,因为它无法在""中找到或加载Qt平台插件" windows"。 重新安装应用程序可能会解决此问题。
我通过
在我的电脑中解决了这个问题或
dist\Hello\PyQt5\Qt\plugins\platform
文件夹复制到Hello.exe所在的位置。但是,当我使用命令 - onefile 捆绑到单个文件时,此问题存在,并且在未设置 QT_QPA_PLATFORM_PLUGIN_PATH 的任何其他计算机上运行。
有人可以帮助解决问题。
答案 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