Как заставить Matplotlib рисовать в отладчике ipdb в Spyder (или любом другом отладчике)? - PullRequest
18 голосов
/ 16 августа 2011

РЕДАКТИРОВАТЬ

К сожалению, на данный момент это невозможно.Я обнаружил, что это ошибка в 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, что и в Attempt# 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 : в моем полном коде у меня много файлов и много функций, поэтому объединение их воедино в одном скрипте без функций невозможно.

Примечание # 2 : Использование любой интерактивной команды matplotlib (например, ion (), interactive (True) и т. Д.) Не дало никаких результатов.

Примечание # 3 : Spyder версии 2.0.12, Python 2.6, matplotlib1.0.1.

Ответы [ 3 ]

8 голосов
/ 05 ноября 2013

( 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)

Ознакомьтесь с комментарием от Джеда Ладлоу, одного из наших бывших разработчиков, где он описывает это решение.

2 голосов
/ 02 декабря 2011

Рассматривали ли вы функцию 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.

1 голос
/ 18 января 2014

Я обнаружил, что теперь вы можете строить графики в режиме отладки, используя Spyder. Это удивительно просто.

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

......

...