当使用 spyder 3.3.3 和 ipython 7.4 时,来自 PyQt5 的 app.exec 会阻塞代码

app.exec from PyQt5 is blocking the code when using spyder 3.3.3 with ipython 7.4

我已经安装了最新的 anaconda 版本 (1.9.7),其中包括 python 3.7.3、spyder 3.3.3、ipython 7.4.0、pyqt 5.9.2,现在我'我有问题 运行 一个代码与以前的 anaconda 安装一起工作正常(anaconda 1.7.0,python:3.6.4,Ipython:6.2.1 和 spyder:3.2。 6). 我检查过 spyder --> 工具--> 首选项 --> Ipython 控制台与两个安装相同。

这里是代码:

import sys
from PyQt5 import QtWidgets

if __name__ == '__main__':

if not QtWidgets.QApplication.instance():
    app = QtWidgets.QApplication(sys.argv)
else:
    app = QtWidgets.QApplication.instance() 
T = QtWidgets.QErrorMessage()
T.setWindowTitle('Error!')
T.showMessage('some message')
T.show()
app.exec()

所以基本上当我 运行 代码(以上)时,我可以看到我的 GUI 打开了。但是,当我关闭 GUI(使用 GUI 右侧的 X)时,IPython 控制台挂起,我无法选择重新启动 spyder(在这种情况下,ctr C 不执行任何操作)。我发现我可以通过删除行 :'app.exec()' 来解决这个问题。但是,大多数时候我是从 anaconda 提示符 运行ning 我的代码,所以我不想从我的代码中删除 'app.exec()'。这段代码与之前安装的 anaconda prompt 和 spyder 一起运行良好(所以基本上与 w/o 使用 ipython)。

我试过工具--> Ipython 控制台--> 图形--> 后端--> 自动,它没有改变任何东西。 如果我取消选中 'Activate support' (Tools--> Ipython console --> Graphics) 它可以解决问题,但我不想去那个方向,因为我发现我无法正确使用 matplotlib(绘图不会显示 没有 plt.show() 并且这将阻止 ipython)(之前的安装 'Activate support' 已被检查)。 我当然可以回到以前的安装,但我想避免这种情况,因为旧安装还有其他问题(我相信最新版本应该可以正常工作)。 我知道我可以临时解决这个问题(当我使用 spyder 时删除 app.exec() 或取消选中 'Activate support')但我想知道我是否遗漏了什么或者这是与新 ipython。 如果您有任何建议,请告诉我。

(这里是 Spyder 维护者) 你说

I have found out that I can fix the issue by removing the line :'app.exec()'.

因此,如果您想 运行 您的代码进出 Spyder,您可以将该行包含在以下 if 块中:

import os
if not os.environ.get('SPY_UMR_ENABLED'):
    app.exec()

这将避免在 Spyder 中 运行 它,因为 SPY_UMR_ENABLED 环境变量存在于我们的控制台中,但它不存在于 Anaconda 提示符或 Jupyter notebook 中。