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

Python 如何在Spyder(或任何其他调试器)的ipdb调试器中强制Matplotlib绘制?,python,debugging,matplotlib,pdb,spyder,Python,Debugging,Matplotlib,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() 在IPython中,键入以下内容: In [4]: import foo In [5]

编辑

不幸的是,目前这是不可能的。我发现这是一个错误。开发者们正在努力


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

    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()
    
    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.
    
    [4]中的
    :导入baz
    --返回--
    没有一个
    >彩虹上的某个地方\u\baz.py(4)()
    2将matplotlib.pyplot作为plt导入
    3.
    ---->四()
    ipdb>plt。
    
然后Spyder完全冻结

有什么建议吗

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

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


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

导入
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()
我的机器(Ubuntu11.04、Python2.7、SciPy bersion 0.8.0)上也可以使用上述功能,甚至可以在Eclipse中与PyDev一起运行。

(此处为Spyder maintainer)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)

我发现现在可以使用Spyder在调试模式下进行绘图。它出人意料地简单

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

..

C:\Python26\lib\site packages\matplotlib\\uuuuu init\uuuuuuu.py:888:UserWarning:对matplotlib.use()的调用无效,因为后端已被选择;在首次导入*pylab、matplotlib.pyplot或matplotlib.backends之前,必须调用*matplotlib.use()。if warn:warnings.warn(\u use\u error\u msg)
In[3]:matplotlib.get\u backend()Out[3]:“Qt4Agg”
您有什么版本的matplotlib?谢谢,我们能够将其更改为TkAgg。同样的问题也发生了
plt.plot()
创建了图形,但内容为白色(即内部未写入任何内容)<代码>plt.show()不执行任何操作
exit()
导致Spyder冻结。@eryksun让我们认为OP希望在调试模式下运行pylab,而不是.py文件中已有的pylab命令。正如@user1914692所说。谢谢@Carlos。我已经确认这适用于
plot()
以及
imshow()
。这是一个近乎充分的临时解决办法。实现它的最佳方法是:(1)将暂停时间设置为一个非常大的数字。(2) 完成后,按Ctrl-C键退出绘图并关闭()。当前的缺点是,除非使用
subplot()
否则无法同时检查多个绘图。我认为更新的问题现在出现在github中,请参见此处:请给出所有版本号(Spyder、Python、图形后端库和版本(例如Qt))。此解决方案适用于Spyder 4.1.2、Python 3.7、,Qt5.9.6.0适用于Spyder 4.2.3和Python 3.7.10
ipdb>pylab.plot(x,y)
ipdb>pylab.show()