2012-05-22 96 views
0

我的项目中有一个奇怪的错误,它使用PySide作为它的Qt GUI,并且为了响应我试图用设置环境的简单代码进行测试。PySide Qt脚本不从Spyder启动,但从shell中运行

这里是我与测试代码:当我启动,从我的外壳(python test.py),它完美https://stackoverflow.com/a/6906552/130164

。然而,当我运行的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. 

为什么从启动时的代码工作我的外壳,但不是从Spyder?


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

回答

2

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

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

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

+0

这就是我怀疑的问题。你知道Spyder中是否有任何解决方法?现在,我已经使用“在外部系统终端执行”选项在Spyder中设置执行,但不会导致错误但不允许调试。也许Spyder对此有一些解决方法? –

+0

我不太了解spyder,所以除了捕捉错误我不知道。 – mata

+1

确实Spyder运行在Qt应用程序实例中,但是所有的Python控制台实例都是在其各自独立的进程中执行的。 – Jed

2

我有同样的问题,并在某处stackoverflow是一个解决方案。取而代之的

qApp = QtGui.QApplication(sys.argv) 

使用

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

我得到了同样的问题,但通过功能测试(使用Qttest和unittest),您的解决方案很好地解决了这个问题。谢谢。 – gunzapper

1

如果您尝试启动应用程序到交互式控制台,因为控制台专门配置为导入多个科学图书馆它不会在Spyder的工作,自动show() matplotlib数字,和一些其他细节。请在Spyder控制台提示下键入scientific以获取更多详细信息。结果是Qt应用程序事件循环已经在那里运行了。

为了让您的应用程序的Spyder内运行:

  1. 确保Spyder的配置为打开与PySide外部控制台,而不是PyQt的。这可以从工具>首选项>控制台>外部模块> Qt-Python绑定库选择进行设置。
  2. 在编辑器中激活脚本,点击F6打开运行设置对话框。选择“在新的专用Python解释器中执行”单选按钮,而不是在当前的交互式解释器中执行。点击OK。现在通过点击F5运行脚本。通过点击Ctrl+F5来调试脚本。
+0

这对我有用。 – neuronet