26

编辑

不幸的是,目前这是不可能的。我发现这是Spyder 中的一个错误。开发人员仍在想办法解决这个问题


目标

在调试代码时可视化数据(我也想使用 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()、interactive(True) 等)都没有效果。

注意 #3:Spyder 版本 2.0.12、Python 2.6、matplotlib 1.0.1。

4

3 回答 3

16

此处为 Spyder 维护者)Spyder 4.2.0于 2020 年 11 月 8 日发布,支持在调试时使用交互式 Matplotlib 图的能力。开箱即用,即不需要设置任何特殊选项。

对于以前的版本,最好的解决方案pause(n)nipdb. 这是一个例子:

from matplotlib.pyplot import imshow, pause
import numpy as np
x = np.random.rand(4,5)
imshow(x)
pause(1)
于 2013-11-05T13:58:06.417 回答
5

我发现您现在实际上可以使用 Spyder 在调试模式下绘图。这非常简单。

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

……

于 2014-01-17T21:39:12.810 回答
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 中运行。

于 2011-12-02T03:02:50.713 回答