捆绑(只是 - onefile)

时间:2014-05-03 15:07:16

标签: python qt pyinstaller pyqt5 vcredist

请阅读所有这些帖子并帮助我。

我想用pyinstaller创建--onefile可执行文件。

我在开发方面有这些:

  • windows 8.1 x64
  • Qt 5.2.1
  • Python 27
  • PyQt5.2.1(使用Visual Studio 2012构建)
  • Visual Studio 2012
  • PyInstaller 2.1
  • pyWin32

和部署方(VirtualBox)中的这些(作为干净的VM):

  • windows 8 x64
  • vcredist_x64 2012

这是我想要构建的简单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_())
#------------------------------------------------

好的,当我将其构建为--onedirpyinstaller main.py)时,它在开发方和部署方面都可以正常工作。

当我将其构建为--onefilepyinstaller -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.dllmsvcm90.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。

4 个答案:

答案 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环境变量
  • 添加我们手动需要的文件夹或文件

    例如:

    • 我们的.qml文件或图片文件夹
    • 使用qml文件等的qml目录

这是样本:

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