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

Pet*_*r D 18 python debugging matplotlib spyder pdb

编辑

不幸的是,目前这是不可能的.我发现这是Spyder的一个错误.开发人员仍在研究如何处理这个问题.


目标

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

尝试#1:从Spyder的IPython运行foo.bar

  • 使用以下代码创建名为foo.py的文件:

    from ipdb import set_trace as st
    import matplotlib.pyplot as plt
    
    def bar():
        st()
    
    Run Code Online (Sandbox Code Playgroud)
  • 在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()
    
    Run Code Online (Sandbox Code Playgroud)

情节仍处于"冻结"状态.如果我退出调试器,则绘制更新.如果我试图关闭情节,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()
    
    Run Code Online (Sandbox Code Playgroud)

程序显示我预期的情节.但我想用Spyder.

尝试#3:从命令行运行IPython中的baz.bar

然后Spyder完全冻结了.

有什么建议?

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

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

注意#3:Spyder版本2.0.12,Python 2.6,matplotlib 1.0.1.

Car*_*oba 8

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

现在(11月13日)的最佳解决方案是在显示绘图后使用pause(n)命令matplotlib(其中n是几秒)pdb.这是一个例子:

from matplotlib.pyplot import imshow, pause
import numpy as np
x = np.random.rand(4,5)
imshow(x)
pause(1)
Run Code Online (Sandbox Code Playgroud)

看看我们以前的开发者之一Jed Ludlow的评论,他在这里描述了这个解决方案.


Wan*_*uan 5

我发现您现在实际上可以使用 Spyder 在调试模式下绘图。这是令人惊讶的简单。

ipdb>pylab.plot(x,y)
ipdb>pylab.show()
Run Code Online (Sandbox Code Playgroud)

......

  • 请提供所有版本号(Spyder、Python、图形后端库和版本(例如 Qt))。 (5认同)

ely*_*ely 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()
Run Code Online (Sandbox Code Playgroud)

上面的代码适用于我的机器(Ubuntu 11.04、Python 2.7、SciPy bersion 0.8.0),甚至可以在 Eclipse 中使用 PyDev 运行。