如何在Spyder(或任何其他调试器)的ipdb调试器中强制使用Matplotlib进行绘制?

时间:2011-08-16 15:39:28

标签: python debugging matplotlib pdb spyder

修改

不幸的是,目前这是不可能的。我发现它是bug in Spyder。开发人员是still figuring out how to approach this


目标

在调试代码时可视化数据(我也想使用Spyder!)。

尝试#1:从Spyder

从IPython运行foo.bar
  • 使用以下代码创建名为foo.py的文件:

    from ipdb import set_trace as st
    import matplotlib.pyplot as plt
    
    def bar():
        st()
    
  • 在IPython中,键入以下内容:

    In [4]: import foo
    
    In [5]: foo.bar()
    --Return--
    None
    > somewhere_over_the_rainbow\foo.py(5)bar()
          3 
          4 def bar():
    ----> 5     st()
    
    ipdb> plt.plot([1, 2], [3, 4])
    [<matplotlib.lines.Line2D object at 0x05CA8E90>]
    ipdb> plt.show()
    

情节仍处于“冻结”状态。如果我退出调试器,则绘制更新。如果我试图关闭情节,IPython会崩溃。显然这两者都是不受欢迎的,也不会让我在调试时看到数据。

尝试#2:从命令行

从IPython运行foo.bar
  • 使用与尝试#1中相同的foo.py:
  • 从命令行打开IPython:

    In [4]: import foo
    
    In [5]: foo.bar()
    --Return--
    None
    > somewhere_over_the_rainbow\foo.py(5)bar()
          3
          4 def bar():
    ----> 5     st()
    
    ipdb> plt.plot([1, 2], [3, 4])
    [<matplotlib.lines.Line2D object at 0x03904070>]
    ipdb> plt.show()
    

程序按照我的预期显示情节。但我想使用Spyder。

尝试#3:从命令行

从IPython运行baz.bar
  • 写baz.py:

    from ipdb import set_trace as st
    import matplotlib.pyplot as plt
    
    st()
    
  • 从命令行打开IPython:

    In [4]: import baz
    --Return--
    None
    > somewhere_over_the_rainbow\baz.py(4)<module>()
          2 import matplotlib.pyplot as plt
          3 
    ----> 4 st()
    
    ipdb> plt.
    
然后Spyder完全冻结了。

有什么建议吗?

注意#1 :在我的完整代码中,我有许多文件和许多功能,因此在一个没有功能的脚本中将它们混合在一起是不可行的。

注意#2 :使用任何matplotlib交互式命令(例如ion(),交互式(True)等)都没有效果。

Note#3 :Spyder版本2.0.12,Python 2.6,matplotlib 1.0.1。

3 个答案:

答案 0 :(得分:8)

Spyder dev here 注意:很抱歉在这么长时间之后回答这个问题,但也许其他人会发现它有用。

现在(11月13日)的最佳解决方案是在{{1}上显示情节后,使用pause(n)中的matplotlib命令(其中n为秒数) }}。这是一个例子:

pdb

从我们之前的开发者之一Jed Ludlow看看这个comment,在那里他描述了这个解决方案。

答案 1 :(得分:2)

导入ion()时是否考虑了pylab功能?这应该允许在pdb中进行交互式绘图。

 import pylab
 import pdb
 pylab.ion()

 tst_xdata = [1,2,3,4,5,6]
 tst_ydata = [1,1,1,1,1,1]

 pylab.plot(tst_xdata,tst_ydata)
 pylab.draw()

 pdb.set_trace()
 for idx in range(3):

     tst_ydata = [elem+2 for elem in tst_ydata]
     pylab.plot(tst_xdata,tst_ydata)
     pylab.draw()

 pylab.show()

以上工作在我的机器上运行(Ubuntu 11.04,Python 2.7,SciPy bersion 0.8.0),甚至可以在带有PyDev的Eclipse中运行。

答案 2 :(得分:1)

我发现你现在可以使用Spyder在调试模式下进行绘图。这非常简单。

ipdb>pylab.plot(x,y)
ipdb>pylab.show()

...