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

qltillow  于 2023-11-22  发布在  其他
关注(0)|答案(3)|浏览(147)

编辑

不幸的是,目前这是不可能的。我发现它是一个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()


Plot保持在“frozen”状态。如果我退出调试器,plot更新。如果我试图关闭plot,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版。

efzxgjgh

efzxgjgh1#

(* 此处为Spyder维护者 *)Spyder4.2.0于2020年11月8日发布,支持在调试时使用交互式Matplotlib绘图的功能。这是开箱即用的,即不需要设置任何特殊选项。
对于以前的版本,最好的解决方案是在ipdb上显示绘图后使用Matplotlib中的pause(n)命令(其中n是秒数)。下面是一个例子:

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

字符串

kxeu7u2r

kxeu7u2r2#

我发现你现在可以使用Spyder在调试模式下绘图了。它出奇的简单。

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

字符串
......

bybem2ql

bybem2ql3#

在导入pylab时,您是否考虑过ion()功能?这应该允许在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。

相关问题