首页 > 解决方案 > 调用使用 PyInstaller (包括 PyQt4)制作的 .exe 时出现运行时错误

问题描述

所以,我有两个.py文件,一个由QtDesigner生成,另一个基本上实现了 GUI 的功能。使用pyinstaller,我生成了一个.exe文件,以便在没有 python 和相关库的系统上使用它。

命令:pyinstaller my_script.py运行良好,没有任何错误。

当我运行.exe文件时出现问题。

错误:

Qt:检测到未经测试的 Windows 10.0 版!回溯(最后一次调用):文件“site-packages\PyInstaller\loader\rthooks\pyi_rth_qt4plugins.py”,第 41 行,在 ImportError:没有名为“PySide”的模块

在处理上述异常的过程中,又出现了一个异常:

回溯(最后一次调用):文件“site-packages\PyInstaller\loader\rthooks\pyi_rth_qt4plugins.py”,第 43 行,在文件“”中,第 2237 行,在 _find_and_load 文件“”中,第 2226 行,在 _find_and_load_unlocked 文件中“” ,第 1191 行,在 _load_unlocked 文件“”中,第 1161 行,在 _load_backward_compatible 文件中“C:\python\lib\site-packages\PyInstaller\loader\pyimod03_importers.py”,第 714 行,在 load_module 模块 = loader.load_module(fullname)

RuntimeError:PyQt4.QtCore 和 PyQt5.QtCore 模块都包装了 QObject 类 [11364] 无法执行脚本 pyi_rth_qt4plugins

所以我试图找到解决这个问题的方法。这些是我尝试过的解决方案:

如何强制 PyQt5 用于 QObject 类?- 只需将PyQt导入作为第一条语句并不能解决问题。

https://github.com/tzutalin/labelImg/issues/268 - 这里建议删除PyQt4仅使用 PyQt5。我的系统上确实有这两个项目,一些项目依赖于PyQt5 ,一些项目依赖于PyQt4 ,因此我不想删除后者。此外,必须有另一种解决方案,让我不要这样做。

https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000551170-PyQt4-and-PyQt5-collisions-in-PyCharm-2017-2-1-when-debugging-QGIS-application -这是一个类似的错误,所以我补充说: matplotlib.rcParams['backend'] = 'Qt4Agg' matplotlib.rcParams['backend.qt4'] = 'PyQt4'

到我的进口,仍然没有工作。

注意: 我正在使用:

PyCharm 2018.1(社区版)

构建 #PC-181.4203.547,构建于 2018 年 3 月 26 日

JRE:1.8.0_152-release-1136-b20 amd64

JVM:JetBrains sro 的 OpenJDK 64 位服务器 VM

视窗 10 10.0

并且代码在 IDE 中运行良好。

编辑

我的进口是:

from PyQt4 import QtCore, QtGui
from matplotlib.backends.backend_qt4agg import FigureCanvasQTagg as Canvas

我没有添加任何其他与 Qt 相关的导入语句。

编辑 - 2

尝试cx_Freeze而不是PyInstaller,这是安装文件。

import sys
from cx_Freeze import setup, Executable

base = None
if sys.platform == "win32":
    base = "Win32GUI"

additional_mods = ['numpy.core._methods', 'numpy.lib.format', 
'numpy._distributor_init']

setup( name="ASCII2fig",
       version = "0.1",
       description = "GUI",
       options = {'build_exe': {'includes': additional_mods}},
       executables = [Executable("ASCII2figALL_main_edited.py", base=base)])

additional_mods在执行脚本后添加了一次ImportError,这是不间断的。有什么方法可以破解并找到我应该明确提及的库?

此外,当我使用 Qt 运行主脚本时,我还尝试检查实际导入了哪些库:

from modulefinder import ModuleFinder

filename = "ASCII2figALL_main_edited.py"
finder = ModuleFinder()
finder.run_script(filename)
for name, mod in finder.modules.items():
    print(name)

显然,它正在内部导入 PyQt5 。如前所述,我没有提到PyQt5的导入语句。

编辑 - 3

因此,我将代码更改为 PyQt5,将pyinstaller更新到最新版本 - 3.4,现在出现了一个新问题,它找不到 Qt 插件。它仍然以某种方式导入 PyQt4,我不知道在哪里。

标签: pythonpyqt4pyqt5pyinstaller

解决方案


所以,我终于让它工作了。不是理想的情况,我不必将库更改为 PyQt5 并确保 PyInstaller 一切正常,但它可以工作。所以这就是我所做的:

  1. 安装了 Python 3.5 版 - 这是因为在我更新到最新的 PyInstaller 版本 (3.4) 并尝试在 python 3.4 上运行后,我收到了一个新错误,它无法找到 Qt 插件。经过一番搜索,我发现由于我使用在Python Extension Packages for Windows上找到的 .whl 文件在 Python 版本(3.4)上安装了 PyQt5 ,因此安装没有与sip捆绑在一起。此外,当我尝试使用 pip 在 Python 3.4 上安装PyQt5时,它不会安装。

  2. 使用pip在新的 Python 版本上安装了 PyQt5 和所有其他库。注意:这个版本的 python 没有安装 PyQt4,所以很可能是这个原因。我将在这个 python 版本上安装 PyQt4 并尝试使用 PyInstaller 再次制作 .exe,看看会发生什么。

因此,总而言之,PyQt5 + Pyinstaller 仅适用于 Python 版本 >= 3.5。希望它可以帮助别人!


推荐阅读