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

问题描述 投票:0回答:3

编辑

不幸的是,目前这是不可能的。我发现这是 Spyder 中的一个 bug 。开发人员仍在研究如何解决这个问题


目标

在调试代码时可视化数据(我也想使用 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。

python debugging matplotlib pdb spyder
3个回答
16
投票

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

对于以前的版本,最好的解决方案是在

pause(n)
上显示绘图后使用 Matplotlib 中的
n
命令(其中
ipdb
是秒数)。这是一个例子:

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

5
投票

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

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

......


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),甚至可以在 Eclipse 中使用 PyDev 运行。

© www.soinside.com 2019 - 2024. All rights reserved.