python - 调用使用 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,我不知道在哪里。
解决方案
所以,我终于让它工作了。不是理想的情况,我不必将库更改为 PyQt5 并确保 PyInstaller 一切正常,但它可以工作。所以这就是我所做的:
安装了 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时,它不会安装。
使用pip在新的 Python 版本上安装了 PyQt5 和所有其他库。注意:这个版本的 python 没有安装 PyQt4,所以很可能是这个原因。我将在这个 python 版本上安装 PyQt4 并尝试使用 PyInstaller 再次制作 .exe,看看会发生什么。
因此,总而言之,PyQt5 + Pyinstaller 仅适用于 Python 版本 >= 3.5。希望它可以帮助别人!
推荐阅读
- r - 将新的 lm 集成到现有的 lm 图中
- java - 比较父列表结构中的嵌套列表以获取 java 中特定索引中的值
- angular - ng test 不执行任何测试用例
- java - 构造函数 BorderStroke(Color, BorderStrokeStyle, null, null) 未定义
- elasticsearch - 查找 Elastic Search 索引的“max_result_window”集?
- dotnetnuke - 如何在 2SXC 中重命名通过 ADAM 上传的文件?
- c# - 使用 C# 控制台应用程序提示用户并运行 SQL 查询
- mysql - 执行更新查询时更改 TIMESTAMP
- node.js - 存根没有在 .then() 内部被调用
- mysql - ¿我做错了什么?