繁体   English   中英

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

[英]How do I force Matplotlib to draw while in the ipdb debugger in Spyder (or any other debugger)?

编辑

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

Plot 仍处于“冻结”状态 state。 如果我退出调试器,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()

正如我所料,程序显示 plot 。 但我想使用 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。

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

对于以前的版本,最好的解决方案是在 ipdb 上显示ipdb后使用 Matplotlib(其中n是秒数)中的pause(n)命令。 这是一个例子:

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

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

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

……

导入 pylab 时是否考虑过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),甚至在 Z32F7222026696F3078788Dev8.0 中运行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM