2

请阅读所有这篇文章并帮助我。

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

我在开发方面有这些:

  • 视窗 8.1 x64
  • Qt 5.2.1
  • 蟒蛇 27
  • PyQt5.2.1(使用 Visual Studio 2012 构建)
  • 视觉工作室 2012
  • PyInstaller 2.1
  • pyWin32

这些在部署端(VirtualBox)(作为一个干净的VM):

  • 窗户 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_())
#------------------------------------------------

好的,当我将其构建为--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

更新2:

我手动添加了msvcp90.dll,并解决了这个警告和错误。msvcm90.dllc:\Python27

更新 3:

qt.conf:

[Paths]
Plugins = qt5_plugins

主要规格:

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

4 回答 4

1

我刚刚第一次尝试使用 pyinstaller 并收到丢失的“windows”消息。

在查看了许多“解决方案”并尝试了各种事情之后,我终于通过将 qwindows.dll 从 C:\Python34\Lib\site-packages\PyQt4\plugins\platforms 放到应用程序目录(dist)加上 qt4_plugins\platforms 来解决(我手动创建了platforms目录,pyinstaller创建了qt4_plugins目录)

不像创建 qt.conf 文件那样优雅,但它使应用程序正常工作。

我应该补充一下,我使用的是 Windows 7、python 3.4 和 PyQt4。

于 2016-05-03T03:46:30.730 回答
0

这可能是其他人尝试在 OSX 上构建的可能重复吗?

每当我使用 pyinstaller 在 Linux 上构建 PyQt4 时,我都无法直接使用 pyinstaller 命令和使用源 python 文件的标志进行构建。我必须首先生成规范文件,对其进行修改,然后使用修改后的规范文件进行构建。

作为构建过程的一部分,您似乎没有选择所需的 Windows 系统文件以及插件文件。这些将需要手动添加到您的规范文件中,以告诉它们作为额外的库收集,以及将插件位置设置为相对位置的修改后的 qt.conf 文件([Paths]\nPlugins = qt5_plugins"

我没有方便的窗口来向您展示特定的规范文件,但这里有一些接近的东西作为我的 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生成一个“骨架”规范文件,其中包含一些来自标志的初始选项,然后对其进行修改。然后我pyinstaller在规范文件上使用。

您也可以在此处查看其他参考资料,尽管它仍然是 OSX: https ://github.com/hvdwolf/pyExifToolGUI/blob/master/MacOSX/pyexiftoolgui.spec

于 2014-05-04T08:17:32.407 回答
0

我可以找到答案并完成工作:有一些错误导致在干净的 vm 中运行 exe 时出现问题:

  • 使用if __name__ == "__main__":
  • 将我们的目录添加到PATH环境变量
  • 手动添加我们需要的文件夹或文件

    例如 :

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

这是样本:

主文件

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_())

这是示例规范文件:

主要规范

# -*- 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
)

我希望这对你有帮助。

谢谢大家

于 2014-05-10T18:51:49.157 回答
0

application failed to start because ... platform plugin "windows"错误也可能是由于 UPX 压缩造成的。

如果您使用 PyInstaller 并设置了 UPX 进行构建,那么您必须手动将压缩文件替换qwindows.dll为未压缩文件。

未压缩的版本可以在这里找到:

C:\Python34\Lib\site-packages\PyQt5\plugins\platforms\qwindows.dll

将上述文件粘贴到临时 PyInstaller 文件夹中,该文件夹位于以下位置:

C:\Users\JohnSmith\AppData\Roaming\pyinstaller\bincache01_py34_64bit\qt5_plugins\platforms\

然后重新运行您的 PyInstaller 命令

于 2015-11-23T00:01:05.977 回答