请阅读所有这些帖子并帮助我。
我想用pyinstaller创建--onefile
可执行文件。
我在开发方面有这些:
和部署方(VirtualBox)中的这些(作为干净的VM):
这是我想要构建的简单python程序:
#main.py
import sys
from PyQt5.QtWidgets import QApplication, QPushButton
app = QApplication(sys.argv)
win = QPushButton("Hello World!")
win.show()
sys.exit(app.exec_())
#------------------------------------------------
好的,当我将其构建为--onedir
(pyinstaller main.py
)时,它在开发方和部署方面都可以正常工作。
当我将其构建为--onefile
(pyinstaller -F main.py
)时,它在开发方面工作正常但在部署方面不起作用。
并提供此错误:
此应用程序无法启动,因为它无法找到或加载 Qt平台插件" windows"。
可用的平台插件有:minimal,offscreen,windows。
重新安装应用程序可能会解决此问题。
我的错是什么?或者这座建筑的问题是什么?
就此错误而言,它无法找到临时文件夹中qt5_plugins
文件夹中的_MEIxxxxx
文件夹。
或者,您认为问题来自sys
模块吗?如果是,我该怎么办?
感谢您提前回复
更新
我应该说我在构建时有这个警告和错误:
1024警告:没有这样的文件C:\ Python27 \ msvcp90.dll 1024警告: 装配不完整1026错误:装配 未找到amd64_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.21022.8_none
UPDATE2:
我手动将msvcp90.dll
,msvcm90.dll
添加到c:\Python27
,此警告和错误已解决。
更新3:
qt.conf:
[Paths]
Plugins = qt5_plugins
main.spec:
# -*- mode: python -*-
a = Analysis(['main.py'],
pathex=['D:\\hello2'],
hiddenimports=['sip', "PyQt5.QtCore", "PyQt5.QtGui", "PyQt5.QtWidgets"],
hookspath=None,
runtime_hooks=None)
pyz = PYZ(a.pure)
plugins = [("qt5_plugins/platforms/qwindows.dll",
"C:\\Qt\\Qt5.2.1\\5.2.1\\msvc2012_64\\plugins\\platforms\\qwindows.dll", "BINARY")]
data = [
("qt.conf", "qt.conf", "DATA")
]
exe = EXE(
pyz,
a.scripts,
a.binaries + plugins,
a.zipfiles,
a.datas + data,
name='main.exe',
debug=False,
strip=None,
upx=True,
console=True
)
使用qt5_plugins
自动创建的 pyinstaller
具有平台插件。我不认为它需要手动添加为extralib。
答案 0 :(得分:1)
我刚刚尝试过第一次使用pyinstaller并收到了失踪的窗口'消息。
在查看了许多解决方案之后'通过将来自C:\ Python34 \ Lib \ site-packages \ PyQt4 \ plugins \ platforms的qwindows.dll放到应用程序目录(dist)和qt4_plugins \ platforms中来尝试各种各样的事情我终于解决了 (我手动创建了平台目录,pyinstaller创建了qt4_plugins目录)
不如创建qt.conf文件那么优雅,但它使应用程序正常工作。
我应该补充一点,我使用的是Windows 7,python 3.4和PyQt4。
答案 1 :(得分:0)
这可能是someone elses attempts to build on OSX的副本吗?
无论何时我在Linux上使用pyinstaller进行PyQt4构建,我都无法使用源python文件直接使用pyinstaller命令和标志构建。我必须首先生成spec文件,并对其进行修改,然后使用修改后的spec文件进行构建。
在构建过程中,您似乎没有获取所需的Windows系统文件以及插件文件。这些需要手动添加到您的spec文件中,以告知它们被收集为额外的库,以及修改后的qt.conf文件,该文件将插件位置设置为相对的([Paths]\nPlugins = qt5_plugins"
)
我没有窗口方便向您显示特定的spec文件,但这里有一些关于我的mac的例子:
a = Analysis(
['/path/to/my/script.py'],
# Path to extra pythonpath locations
pathex=['/path/to/my/script'],
# Extra imports that might not have been auto-detected
hiddenimports=["PySide", "PySide.QtCore", "PySide.QtGui"],
hookspath=None,
runtime_hooks=None
)
pyz = PYZ(a.pure)
# Binary files you need to include in the form of:
# (<destination>, <source>, "<TYPE>")
plugins = [
(
"qt4_plugins/imageformats/libqjpeg.dylib",
"/usr/local/Cellar/qt/4.8.1/plugins/imageformats/libqjpeg.dylib",
"BINARY"
),
(
"qt4_plugins/phonon_backend/libphonon_qt7.dylib",
"/usr/local/Cellar/qt/4.8.1/plugins/phonon_backend/libphonon_qt7.dylib",
"BINARY"
)
]
# Data files you want to include, in the form of:
# (<destination>, <source>, "<TYPE>")
data = [
("qt.conf", "qt.conf", "DATA")
]
exe = EXE(
pyz,
a.scripts,
a.binaries + plugins,
a.zipfiles,
a.datas + data,
name='script',
debug=False,
strip=None,
upx=True,
console=False,
resources=['qt.conf']
)
# This BUNDLE part is only relevant on a MAC
app = BUNDLE(
exe,
name='script',
icon=None
)
我首先使用utils/makespec.py
来生成&#34;骨架&#34; spec文件,从标志中有一些初始选项,然后修改它。然后我在spec文件上使用pyinstaller
。
您也可以在这里查看其他一些参考资料,尽管它仍然是OSX: https://github.com/hvdwolf/pyExifToolGUI/blob/master/MacOSX/pyexiftoolgui.spec
答案 2 :(得分:0)
我能找到答案并完成工作: 有一些错误导致在干净的vm中运行exe时出现问题:
if __name__ == "__main__":
PATH
环境变量添加我们手动需要的文件夹或文件
例如:
这是样本:
main.py
import sys
import os
from PyQt5.QtWidgets import QApplication, QPushButton
# from PyQt4.QtGui import QPushButton, QApplication
if getattr(sys, 'frozen', False):
FullDirectory = os.path.join(os.environ.get("_MEIPASS", sys._MEIPASS))
os.environ['PATH'] = FullDirectory
# QApplication.addLibraryPath(FullDirectory)
else:
FullDirectory = os.path.dirname(os.path.abspath(__file__))
if __name__ == "__main__":
app = QApplication(sys.argv)
win = QPushButton("Hello World!")
win.show()
sys.exit(app.exec_())
这是样本规范文件:
main.spec
# -*- mode: python -*-
import os
import platform
import sys
sys.path.append("")
a = Analysis(['main.py'])
pyz = PYZ(a.pure)
exename = 'main.exe'
if "64" in platform.architecture()[0]:
exename = 'main_x64.exe'
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name=os.path.join('dist', exename),
debug=False,
strip=None,
upx=True,
console=True
)
我希望这对你有所帮助。
感谢所有
答案 3 :(得分:0)
application failed to start because ... platform plugin "windows"
错误也可能是由于UPX压缩造成的。
如果您正在使用PyInstaller并将UPX设置为构建,那么您必须手动将压缩的qwindows.dll
替换为未压缩的C:\Python34\Lib\site-packages\PyQt5\plugins\platforms\qwindows.dll
。
可以在此处找到未压缩的版本:
C:\Users\JohnSmith\AppData\Roaming\pyinstaller\bincache01_py34_64bit\qt5_plugins\platforms\
将上述文件粘贴到临时PyInstaller文件夹中,该文件夹可以在以下位置找到:
while
然后重新运行PyInstaller命令