Как заставить Matplotlib рисовать в отладчике ipdb в Spyder (или любом другом отладчике)?
ИЗМЕНИТЬ
К сожалению, на данный момент это невозможно. Я узнал, что это ошибка в Spyder. Разработчики все еще выясняют, как подходить к этому.
Цель
Визуализируйте данные во время отладки кода (и я тоже хочу использовать Spyder!).
Попытка # 1: Запустить foo.bar из IPython из 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. Очевидно, что это нежелательно и не позволяет мне видеть данные во время отладки.
Попытка # 2: Запустить foo.bar из IPython из командной строки
- Используйте тот же foo.py, что и в попытке # 1:
-
Откройте 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: Запустить baz.bar из IPython из командной строки
-
Напишите 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. В моем полном коде у меня много файлов и множество функций, поэтому объединение всех этих файлов в один script без функций не является жизнеспособным.
Примечание # 2. Использование любой интерактивной команды matplotlib (например, ion(), интерактивный (True) и т.д.) не имело эффекта.
Примечание № 3: Spyder версии 2.0.12, Python 2.6, matplotlib 1.0.1.
Ответы
Ответ 1
(Spyder dev здесь) Примечание: Извините за ответ на этот вопрос через столько времени, но, возможно, кто-то еще найдет его себе.
Лучшее решение прямо сейчас (ноябрь/13) - использовать команду pause(n)
из matplotlib
(где n
- количество секунд) после отображения графика на pdb
. Вот пример:
from matplotlib.pyplot import imshow, pause
import numpy as np
x = np.random.rand(4,5)
imshow(x)
pause(1)
Просмотрите этот комментарий от Jed Ludlow, одного из наших бывших разработчиков, где он описывает это решение.
Ответ 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.
Ответ 3
Я обнаружил, что теперь вы можете нарисовать в режиме отладки, используя Spyder. Это удивительно просто.
ipdb>pylab.plot(x,y)
ipdb>pylab.show()
......