编辑
不幸的是,目前这是不可能的。我发现这是 Spyder 中的一个 bug 。开发人员仍在研究如何解决这个问题。
在调试代码时可视化数据(我也想使用 Spyder!)。
使用以下代码创建一个名为 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 就会崩溃。显然两者都是不可取的,而且都不能让我在调试时看到数据。
使用与尝试 #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。
编写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 绘图的功能。这是开箱即用的,即不需要设置任何特殊选项。
对于以前的版本,最好的解决方案是在
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)
我发现您现在实际上可以使用 Spyder 在调试模式下进行绘图。它非常简单。
ipdb>pylab.plot(x,y)
ipdb>pylab.show()
......
导入
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 运行。