PySide Qt 脚本不能从 Spyder 启动,但可以从 shell 运行

Posted

技术标签:

【中文标题】PySide Qt 脚本不能从 Spyder 启动,但可以从 shell 运行【英文标题】:PySide Qt script doesn't launch from Spyder but works from shell 【发布时间】:2012-05-29 08:54:04 【问题描述】:

我的项目中有一个奇怪的错误,它使用 PySide 作为其 Qt GUI,作为回应,我正在尝试使用设置环境的更简单的代码进行测试。

这是我正在测试的代码:https://***.com/a/6906552/130164

当我从我的 shell (python test.py) 启动它时,它运行良好。但是,当我在 Spyder 中运行该脚本时,出现以下错误:

Traceback (most recent call last):
  File "/home/test/Desktop/test/test.py", line 31, in <module>
    app = QtGui.QApplication(sys.argv)
RuntimeError: A QApplication instance already exists.

如果有帮助,我还会收到以下警告:

/usr/lib/pymodules/python2.6/matplotlib/__init__.py:835: UserWarning:  This call to matplotlib.use() has no effect
because the the backend has already been chosen;
matplotlib.use() must be called *before* pylab, matplotlib.pyplot,
or matplotlib.backends is imported for the first time.

为什么该代码从我的 shell 启动而不是从 Spyder 启动时有效?


更新: Mata 回答说问题的发生是因为 Spyder 使用 Qt,这是有道理的。目前,我已经使用“在外部系统终端中执行”选项在 Spyder 中设置了执行,这不会导致错误,但也不允许调试。 Spyder 是否有任何内置的解决方法?

【问题讨论】:

你应该选择一个答案并投票。 【参考方案1】:

由于Spyder 也是Qt 应用程序,它会启动它自己的QApplication。在同一个进程中只能存在一个QApplication,这就是你得到第一个错误的原因。

Sypder 也使用了matplotlib,因此它可能已经导入了一些提到的模块,所以这就是你得到第二个错误的原因。

所以当这样使用它时,你不能创建自己的QApplication 或调用matplotlib.use()。或者,如果您将这些调用包装在 try/except 中,它可能会起作用。

【讨论】:

这就是我怀疑的问题。你知道 Spyder 中是否有任何解决方法吗?目前,我已经使用“在外部系统终端中执行”选项在 Spyder 中设置了执行,这不会导致错误,但也不允许调试。也许 Spyder 对此有一些解决方法? 我不太了解 spyder,所以除了捕捉错误我一无所知。 Spyder 确实在 Qt 应用程序实例中运行,但所有 Python 控制台实例都在各自独立的进程中执行。【参考方案2】:

我有同样的问题,*** 上的某个地方是一个解决方案。

代替

qApp = QtGui.QApplication(sys.argv)

使用

qApp = QtGui.QApplication.instance()
if qApp is None:
        qApp = QtGui.QApplication(sys.argv)

【讨论】:

我遇到了同样的问题,但是通过功能测试(使用 Qttest 和 unittest),您的解决方案可以很好地解决它。谢谢。【参考方案3】:

如果您尝试将应用程序启动到交互式控制台中,它将无法在 Spyder 中运行,因为该控制台经过特殊配置以导入多个科学库、自动 show() matplotlib 数字以及一些其他细节。在 Spyder 控制台提示符下键入 scientific 以获取更多详细信息。结果是 Qt 应用程序事件循环已经在那里运行。

让您的应用程序在 Spyder 中运行:

    确保将 Spyder 配置为使用 PySide 而不是 PyQt 打开外部控制台。这可以从 Tools>Preferences>Console>External modules>Qt-Python bindings library selection 进行设置。 在编辑器中激活脚本后,点击F6 打开“运行设置”对话框。选择“在新的专用 Python 解释器中执行”单选按钮,而不是在当前交互式解释器中执行。点击OK。现在通过点击F5 运行脚本。点击Ctrl+F5 调试脚本。

【讨论】:

【参考方案4】:

官方 Spyder wiki 有一个关于该主题的页面:https://github.com/spyder-ide/spyder/wiki/How-to-run-PyQt-applications-within-Spyder。它的要点是:

重要提示:在 Spyder 中运行 PyQt 应用程序之前,您需要将图形后端更改为 Automatic。你可以去

Tools > Preferences > IPython Console > Graphics

之后,请重新启动您的控制台内核或 Spyder 本身以使此更改生效。

末尾有an explantion:

在 Spyder 中多次运行 PyQt 应用程序时最常见的问题是 QApplication 实例在第一次运行后仍保留在 IPython 控制台内核的命名空间中。换句话说,当您尝试重新运行您的应用程序时,您已经初始化了一个 QApplication 实例。

按照here 的建议,尝试删除该实例可能会导致您的程序卡在阻塞的while循环中,并且使用sys.exit() 无济于事,因为它与尝试退出Python相同(因此IPython 控制台)。

建议的解决方案类似于@mata suggsets。

【讨论】:

以上是关于PySide Qt 脚本不能从 Spyder 启动,但可以从 shell 运行的主要内容,如果未能解决你的问题,请参考以下文章

在 Spyder 中看不到由 PySide2 创建的应用程序窗口

Spyder 无法启动 - “无法找到或加载 Qt 平台插件窗口”

将 PySide/PyQt 小部件嵌入到 Qt/C++ 应用程序中

PySide2和pyinstaller gui应用程序将无法在某些Windows计算机上运行

带有 Pyinstaller 的 PySide2:无法执行脚本 pyi_rth_pkgres

Spyder 未从 Anaconda 环境之一启动