Подтвердить что ты не робот

Как заставить 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.

4b9b3361

Ответ 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()

......