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计算机上运行