Python PySide Qt脚本不是从Spyder启动的,而是从shell启动的

Python PySide Qt脚本不是从Spyder启动的,而是从shell启动的,python,qt,pyqt,pyside,spyder,Python,Qt,Pyqt,Pyside,Spyder,我的项目中有一个奇怪的bug,它使用PySide作为QtGUI,作为回应,我尝试使用设置环境的更简单代码进行测试 以下是我正在测试的代码: 当我从shell python test.py启动它时,它工作得非常好。但是,在Spyder中运行该脚本时,出现以下错误: Traceback (most recent call last): File "/home/test/Desktop/test/test.py", line 31, in <module> app = QtGu

我的项目中有一个奇怪的bug,它使用PySide作为QtGUI,作为回应,我尝试使用设置环境的更简单代码进行测试

以下是我正在测试的代码:

当我从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.
为什么从我的shell启动而不是从Spyder启动时,该代码可以工作

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

由于Spyder也是一个Qt应用程序,它会启动自己的QApplication。在同一过程中,只能存在一个QApplication,这就是为什么会出现第一个错误

Sypder还使用matplotlib,因此它可能已经导入了一些提到的模块,这就是为什么会出现第二个错误

因此,这样使用时,您无法创建自己的QApplication或调用matplotlib.use。或者,如果您将这些调用包装在try/except中,它可能会起作用。

因为Spyder也是一个Qt应用程序,它会启动自己的QApplication。在同一过程中,只能存在一个QApplication,这就是为什么会出现第一个错误

Sypder还使用matplotlib,因此它可能已经导入了一些提到的模块,这就是为什么会出现第二个错误


因此,这样使用时,您无法创建自己的QApplication或调用matplotlib.use。或者,如果您将这些调用包装在try/except中,它可能会起作用。

我也有同样的问题,stackoverflow上的某个地方有一个解决方案

而不是

qApp = QtGui.QApplication(sys.argv)
使用


我也有同样的问题,在stackoverflow的某个地方有一个解决方案

而不是

qApp = QtGui.QApplication(sys.argv)
使用


如果您尝试将应用程序启动到交互式控制台中,它在Spyder中将不起作用,因为该控制台专门配置为导入多个科学库、自动显示matplotlib图形和一些其他详细信息。在Spyder控制台提示符处键入scientific以获取更多详细信息。结果是Qt应用程序事件循环已经在那里运行

要使应用程序在Spyder内部运行,请执行以下操作:

确保Spyder配置为使用PySide而不是PyQt打开外部控制台。这可以通过工具>首选项>控制台>外部模块>Qt Python绑定库选择进行设置。 在编辑器中激活脚本后,点击F6打开“运行设置”对话框。选择在新的专用Python解释器中执行单选按钮,而不是在当前交互式解释器中执行。单击“确定”。现在点击F5运行脚本。通过按Ctrl+F5调试脚本。
如果您尝试将应用程序启动到交互式控制台中,它在Spyder中将不起作用,因为该控制台专门配置为导入多个科学库、自动显示matplotlib图形和一些其他详细信息。在Spyder控制台提示符处键入scientific以获取更多详细信息。结果是Qt应用程序事件循环已经在那里运行

要使应用程序在Spyder内部运行,请执行以下操作:

确保Spyder配置为使用PySide而不是PyQt打开外部控制台。这可以通过工具>首选项>控制台>外部模块>Qt Python绑定库选择进行设置。 在编辑器中激活脚本后,点击F6打开“运行设置”对话框。选择在新的专用Python解释器中执行单选按钮,而不是在当前交互式解释器中执行。单击“确定”。现在点击F5运行脚本。通过按Ctrl+F5调试脚本。
官方Spyder wiki上有一个主题页面:。其要点是:

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

Tools > Preferences > IPython Console > Graphics
之后,请重新启动控制台内核或Spyder本身,以使此更改生效

最后是:

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

正如建议的那样,尝试删除该实例可能会导致程序陷入阻塞while循环,并且使用sys.exit没有帮助,因为这与尝试退出Python以及IPython控制台是一样的


一个建议的解决方案是做些什么。

官方Spyder wiki有一个关于这个主题的页面:。其要点是:

重要提示:在Spyder中运行PyQt应用程序之前,需要将图形后端更改为 自动的你可以通过去

Tools > Preferences > IPython Console > Graphics
之后,请重新启动控制台内核或Spyder本身,以使此更改生效

最后是:

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

正如建议的那样,尝试删除该实例可能会导致程序陷入阻塞while循环,并且使用sys.exit没有帮助,因为这与尝试退出Python以及IPython控制台是一样的


一个建议的解决方案是做些什么。

我怀疑这就是问题所在。你知道Spyder内置了哪些变通方法吗?现在,我已经使用executeinexternalsystemterminal选项在Spyder中设置了执行,该选项不会导致错误,但也不允许调试。也许Spyder对此有一些解决方法?我对Spyder了解不够,所以除了捕获错误之外,我也不知道。Spyder确实在Qt应用程序实例中运行,但所有Python控制台实例都在各自的进程中执行。这就是我怀疑的问题所在。你知道Spyder内置了哪些变通方法吗?现在,我已经使用executeinexternalsystemterminal选项在Spyder中设置了执行,该选项不会导致错误,但也不允许调试。也许Spyder对此有一些解决方法?我对Spyder了解不够,所以除了捕获错误外,我也不知道。Spyder确实在一个Qt应用程序实例中运行,但所有Python控制台实例都在各自的单独进程中执行。我遇到了同样的问题,但使用Qttest和unittest进行功能测试,你的解决方案很好地解决了这个问题。谢谢。我也遇到了同样的问题,但是通过使用Qttest和unittest进行功能测试,您的解决方案很好地解决了这个问题。谢谢。您应该选择答案并向上投票。您应该选择答案并向上投票。