调用包含PyQt4的PyInstaller制作的.exe时发生运行时错误

时间:2018-12-05 13:23:09

标签: python pyqt4 pyqt5 pyinstaller

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

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

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

错误:

  

Qt:检测到未经测试的Windows 10.0版本!   追溯(最近一次通话):     在第41行中输入文件“ site-packages \ PyInstaller \ loader \ rthooks \ pyi_rth_qt4plugins.py”   ImportError:没有名为“ PySide”的模块

     

在处理上述异常期间,发生了另一个异常:

     

回溯(最近通话最近):     在第43行中输入文件“ site-packages \ PyInstaller \ loader \ rthooks \ pyi_rth_qt4plugins.py”     _find_and_load中的文件“”,第2237行     _find_and_load_unlocked中的文件“”,第2226行     文件“”,行1191,在_load_unlocked中     _load_backward_compatible中的文件“”,行1161     在load_module中的文件“ C:\ python \ lib \ site-packages \ PyInstaller \ loader \ pyimod03_importers.py”,第714行       module = loader.load_module(全名)

     

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

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

How to force PyQt5 use for QObject class?-只需导入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 s.r.o的OpenJDK 64位服务器VM

Windows 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

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

1 个答案:

答案 0 :(得分:1)

所以,我终于做到了。这不是理想的情况,在这种情况下,我不必将库更改为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。希望对别人有帮助!