Spyder: Невозможно увидеть графики, созданные с помощью Matplotlib во время отладки

Созданный на 17 февр. 2015  ·  47Комментарии  ·  Источник: spyder-ide/spyder

_От al.dan ... @ gmail.com, 2011-04-12T17: 33: 50Z_

Этот сценарий при запуске в spyder отлично работает и создает контурный график:

#! / usr / bin / env python
из matplotlib.pyplot import imshow, show
импортировать numpy как np
х = np.random.rand (4,5)
imshow (x)
Показать()

Однако, если я вхожу в режим отладки и устанавливаю точку останова в строке imshow (x), затем вручную набираю команды imshow (x) и show () в приглашении (Pdb), график не появляется. Я получаю только ссылку на сюжетный объект:

(Pdb) imshow (x)

(Pdb) показать ()
(PDB)

Было бы неплохо получить возможность отображать переменные в режиме отладки.

Python 2.7.1
NumPy 1.5.1
matplotlib 1.0.1 (бэкэнд WXAgg)
RHEL 4.8 x86_64

_Исходная проблема: http://code.google.com/p/spyderlib/issues/detail?id=620_

11–20 stars Debugger Bug

Самый полезный комментарий

См. Https://github.com/matplotlib/matplotlib/pull/4779 для получения более подробной информации.

Очень короткая версия, чтобы графический интерфейс реагировал, должен быть запущен цикл событий (который, по сути, бесконечный цикл, ожидающий ввода-вывода пользователя). Приглашение отладки также находится в бесконечном цикле, ожидая ввода пользователем. В «обычном» приглашении выполняется некоторая деликатная интеграционная работа, чтобы позволить этим двум циклам совместно использовать (в основном, приглашение позволяет циклу графического интерфейса работать до тех пор, пока не будет нажата одна клавиша, обрабатывает клавиши, а затем перезапускает цикл событий графического интерфейса пользователя). В запросе отладки эта интеграция не выполняется, и фигура кажется «мертвой». Это повлияет на любое окно на основе графического интерфейса.

Причина, по которой вызов plt.pause() работает, заключается в том, что явно запускает цикл событий графического интерфейса пользователя в течение заданного количества секунд.

Встроенный бэкэнд работает, потому что он просто создает статический png (поэтому _ всегда_ «мертвый»).

Все 47 Комментарий

_От al.dan ... @ gmail.com, 2011-04-12T15: 40: 57Z_

Забыл добавить, что это со spyder 2.0.8 и ipython 0.10.1.
Кроме того, при запуске spyder серверной частью является Qt4Agg. Я получаю WXAgg, когда запускаю ipython прямо из окна терминала (то есть независимо от spyder).

_Из ccordoba12 на 2011-05-15T19: 31: 44Z_

Ярлыки: Cat-Debugger

_Из ccordoba12 на 2011-08-16T11: 41: 02Z_

выпуск №733 был объединен в этот выпуск.

_От eigenjoh ... @ gmail.com, 2011-11-10T07: 23: 21Z_

это исправление сделало бы это приложение убийцей Matlab

_От kavaldj ... @ gmail.com 2013-05-12T21: 43: 03Z_

Это было исправлено или решено как-то?

Я согласен с комментарием #4 : это сделает Spyder ближе к убийце ML

_Из contrebasse 2013-05-13T00: 37: 52Z_

1: это нормально, бэкэнд по умолчанию для matplotlib - WXAgg. Вы можете изменить это в своем скрипте:

импортировать matplotlib
matplotlib.use ('Qt4Agg', warn = False)

_Из jed.lud ... @ gmail.com, 2013-05-13T07: 45: 45Z_

Дополнительная недавняя диагностика после дополнительного тестирования:

  • Построение не удается при отладке внутри Spyder, когда сценарий выполняется в текущем интерактивном сеансе Python или интерактивном сеансе IPython. Это верно для бэкэндов Qt4Agg или WXAgg.
  • Построение во время отладки отлично работает внутри Spyder, если сценарий настроен на выполнение в собственном специализированном интерпретаторе Python. Это также не зависит от серверной части.
  • Построение во время отладки отлично работает из сеанса "ipython qtconsole" при выполнении в системной консоли.

Soyder 2.3.0dev (ревизия 0bb65fdb4b6e)
Python 2.7.3 32-разрядный
IPython 0.13.2
Matplotlib 1.2.0
Windows 7 (64-битная)

_От kavaldj ... @ gmail.com, 2013-05-14T13: 45: 31Z_

8 Джед, спасибо !!

У меня работает отладка в специальном интерпретаторе, спасибо за отличный совет!

Прошу прощения, если показался жадным, но есть ли простой способ сделать фигуру немодальной?

Прямо сейчас он блокирует интерпретатор, поскольку он остановлен в Pdb, может быть, я могу использовать еще один трюк? Я просто вызываю imshow (data), show ().

Огромное спасибо заранее!
дан

_Из jed.lud ... @ gmail.com, 2013-05-14T16: 55: 16Z_

@ -kavaldijiev: Сделать фигуру немодальной - сложная задача. Похоже, что Карлос попытался решить эту проблему в рамках проблемы № 733, и это может быть непросто без некоторых интересных потоков. Вероятно, это как-то связано с тем, что интерактивный режим matplotlib должен работать параллельно с pdb, и вам нужно будет выяснить, как заставить эти потоки взаимодействовать.

Обратите внимание, что если вы пытаетесь построить график во время отладки в IPython Qt Console, он также блокируется после того, как вы введете команду «show ()». Там тоже не совсем интерактивно.

На данный момент лучший способ решения проблемы - запуск специального интерпретатора.

_От kavaldj ... @ gmail.com, 2013-05-15T14: 54: 57Z_

@ -jed Спасибо за подробное объяснение!

Обойдусь с модальными фигурами. Но определенно стоит заставить его работать в долгосрочной перспективе, это может быть чрезвычайно привлекательно для толпы MATLAB.

_Из jed.lud ... @ gmail.com, 2013-05-16T07: 57: 29Z_

@ -kavaldijiev: После небольшого исследования есть еще один обходной путь, который должен предоставить вам способ интерактивного построения графика во время отладки. Похоже, что компоненты Qt GUI, вероятно, мешают интерактивному построению графиков. Если вы запускаете IPython _без_ интерфейса консоли Qt, интерактивное построение графиков работает при отладке _без блокировки. Вот команды:

  1. Откройте командную строку и перейдите в каталог, в котором находится ваш скрипт.
  2. В командной строке выполните «ipython --pylab».
  3. Внутри IPython запустите "% run -d.py "
  4. Теперь вы должны иметь возможность выполнять код с помощью команд pdb, строить график с помощью imshow (), и график должен рисоваться без блокировки ввода в командной строке.

_Из jed.lud ... @ gmail.com, 2013-05-16T15: 11: 32Z_

И после небольшого исследования я нашел этот ответ: http://stackoverflow.com/questions/12822762/pylab-ion-in-python-2-matplotlib-1-1-1-and-updating-of-the -plot-while-the-pro / 12826273 # 12826273 Итак, если код в исходном сообщении изменен таким образом:

из matplotlib.pyplot import imshow, pause
импортировать numpy как np
х = np.random.rand (4,5)
imshow (x)
пауза (1)

вы можете обновить график в интерактивном режиме внутри интерактивной консоли Spyder во время отладки без блокировки! Итак, используйте pause (1) вместо show (). График становится интерактивным только на время паузы, поэтому, если вам нужно больше времени для увеличения или панорамирования данных, используйте паузу (10) или паузу (20). Также работает в консоли IPython Qt.

_От kavaldj ... @ gmail.com, 2013-05-16T22: 35: 04Z_

@ -jed, спасибо, оба метода работают!

Метод командной строки выглядит более надежным - я могу закрыть открытые фигуры, а фигуры могут получить фокус (для увеличения и т. Д.), Пока не будут закрыты.

Очевидно, что метод паузы предпочтительнее, так как он находится в Spyder. Пауза возвращает управление с клавиатуры, но окно не должно закрываться, иначе интерпретатор зависнет. Открывать новые цифры сложно - иногда удается, иногда нет, но я не тратил много времени на тестирование.

В любом случае, любой из них чрезвычайно полезен для отладки, даже не такой простой и надежный, как ML.

Привет,
дан

_От al.dan ... @ gmail.com в 2013-05-19T21: 08: 30Z_

Рад видеть прогресс через пару лет. Да, у меня хорошо работает трюк с паузой (n). Спасибо, @ -jed, за решение проблемы!

_Из jed.lud ... @ gmail.com, 2013-05-20T09: 13: 28Z_

Я не могу поверить ни в чем, кроме расследования. Функция pause (n) - это функция matplotlib, которую я только что обнаружил.

В конечном счете, корень этой проблемы на самом деле заключается во взаимодействии между циклами событий рисования matplotlib и циклами событий приложения Qt, и я не уверен, что для этого действительно существует "Spyder" решение. Вероятно, это нужно решить на уровне matplotlib. Как свидетельство этого, IPython, работающий на консолях Qt, страдает теми же ограничениями.

_Из jason.bo ... @ gmail.com, 2014-07-07T05: 33: 04Z_

Эта проблема, похоже, была решена в IEP: https://bitbucket.org/iep-project/iep/issue/297/interactive-plotting-is-not-working-during

_Из ccordoba12 в 2014-07-07T07: 53: 08Z_

Выпуск № 1848 был объединен в этот выпуск.

Мне просто было интересно, может ли кто-нибудь дать мне небольшое представление о том, куда мы движемся со всем этим. Я подозреваю, что я не единственный, кто потратил много времени на Matlab и очень увлечен миром Python по разным причинам и ощущает, что истинная продуктивность мучительно близка, но, как мираж, кажется, всегда просто нет досягаемости. Обходной путь pause () великолепен, а скорость реагирования команды Spyder действительно впечатляет. И теперь, когда проблема медленного редактора в El Capitan, казалось бы, решена в бета-версии 3.0, все кажется _ так близко_. И все еще ...

Итак, к чему, по мнению эксперта, все это приведет? Насколько я могу судить, большая часть проблемы связана с самим Matplotlib. И я также понимаю, что guiqwt сейчас не в хорошей форме. Так неужели люди думают, что мы приближаемся к ситуации, когда мы можем отлаживать в IDE, достигать точек останова и выполнять интерактивное построение графиков из точек останова, и все это в некоторой степени без проблем? Я думаю, что это то, чего хотят все бывшие пользователи Matlab, и некоторые из нас задаются вопросом, стоит ли нам потратить 200 долларов на Matlab Home Edition, вернувшись к The Borg и уйдя от подхода Python и привлекательности программного обеспечения, основанного на сообществе, и Язык Python.

Может показаться, что я жалуюсь, но на самом деле я просто пытаюсь понять, как тратить свое время. Я действительно хочу, чтобы Python был убийцей Matlab, это могло быть ...

@jandyman , пожалуйста, не отчаивайтесь :-) Мы провели масштабную реорганизацию / очистку для Spyder 3.0, что было бы очень полезно для Spyder 4.0, где мы планируем решить эту проблему.

Настоящая проблема заключается не в Matplotlib, а в архитектуре IPython / Jupyter, которая блокирует консоль во время отладки, не позволяя нам запускать более функциональный сеанс отладки (с просмотром истории и графиками), как в Matlab.

Но позвольте мне заверить вас, что после выпуска 3.0 (примерно через месяц) все наши усилия будут направлены на решение многих нерешенных и очень неприятных проблем отладки, которые есть у Spyder. Если все пойдет хорошо и мы добьемся успеха, мы планируем выпустить наши исправления в 4.0 (как я уже сказал) к концу года или в начале следующего :-)

Я также понимаю, что guiqwt сейчас не в отличной форме

Это проект @PierreRaybaut (того самого, кто создал Spyder). К сожалению, в последнее время у него не так много времени на open source :-(

Я также понимаю, что guiqwt сейчас не в отличной форме

Это проект @PierreRaybaut (того самого, кто создал Spyder). К сожалению, в последнее время у него не так много времени на open source :-(

@ ccordoba12 , @jandyman : К сожалению, это верно.
Однако недавно я проделал значительную работу над guiqwt: я решил проблему устаревания PyQwt, переопределив его на чистом Python (см. Проект PythonQwt ), чтобы guiqwt v3 больше не полагался на PyQwt. Не думаю, что guiqwt сейчас в плохом состоянии: благодаря недавним разработкам он работает на Python 2.7, 3.0-3.5 и с Qt4-Qt5. Но проект не растет, потому что у меня нет времени на управление им (т.е. создание новых функций, продвижение библиотеки и т. Д.) - я занимаюсь только обслуживанием, чтобы текущие функции продолжали работать, как прежде. Как бы то ни было, обратите внимание, что он по-прежнему намного, гораздо более производительный, чем matplotlib (или MATLAB) для отображения и управления большими изображениями в реальном времени (например, масштабирование / панорамирование, регулировка контраста, построение поперечных сечений и т. Д.), И это впереди matplotlib в отношении интерактивности.

Что касается оригинального сообщения @ ccordoba12 , Spyder теперь полагается на IPython / Jupyter: это отличная вещь, поскольку в нем реализовано множество новых функций, но у него также есть свои недостатки.
В любом случае, я не понимаю, почему в Spyder нельзя взаимодействовать так же, как в MATLAB.

Всем привет,

Я один из пользователей, которые перешли с MATLAB на Python. Я думаю, что Spyder - отличная IDE, но проблема отсутствия интерактивного построения графиков во время отладки является важным недостатком для людей, которые приходят из MATLAB.

Думаю, это не должно быть так сложно решить. Например, я запускаю IPython из системного терминала (без qtConsole) и могу безупречно выполнять интерактивный сюжет (guiqwt) из сессий IPython или ipdb. Кроме того, при отладке у меня есть история команд. Я думаю, что если вы просто замените (или добавите опцию) запуск ipython с терминала (без qtConsole), эта проблема будет решена.

Пожалуйста, попробуйте исправить это, поскольку я думаю, что это единственное, что мешает многим людям использовать Spyder.

Благодаря,

Фелипе

Думаю, это не должно быть так сложно решить.

Это. Библиотеки и технологии, используемые IPython в терминале и qtconsole, совершенно разные.

Ни за что этот баг открыт уже 5 лет, и еще будет еще какое-то время ;-)

Мне нужна эта функция, потому что я использую Spyder в качестве основной среды IDE для разработки алгоритмов обработки изображений, просмотр изображений во время отладки - очень распространенный запрос функции.

Хотелось бы тоже, Spyder использую в основном для отладки.

@mmagnuski , это возможно прямо сейчас, используя магию %plot во время отладки, например

%plot plt.plot(range(10))

Но для того, чтобы это сработало, вам нужно установить бэкэнд Matplotlib на Inline .

@tacaswell Я разговаривал с @WeatherGod, и он подумал, что вы могли бы

Было бы здорово, если бы это работало "без сбоев", хотя я понимаю, что это сложно.

А пока я использую трюк pause(10) .

См. Https://github.com/matplotlib/matplotlib/pull/4779 для получения более подробной информации.

Очень короткая версия, чтобы графический интерфейс реагировал, должен быть запущен цикл событий (который, по сути, бесконечный цикл, ожидающий ввода-вывода пользователя). Приглашение отладки также находится в бесконечном цикле, ожидая ввода пользователем. В «обычном» приглашении выполняется некоторая деликатная интеграционная работа, чтобы позволить этим двум циклам совместно использовать (в основном, приглашение позволяет циклу графического интерфейса работать до тех пор, пока не будет нажата одна клавиша, обрабатывает клавиши, а затем перезапускает цикл событий графического интерфейса пользователя). В запросе отладки эта интеграция не выполняется, и фигура кажется «мертвой». Это повлияет на любое окно на основе графического интерфейса.

Причина, по которой вызов plt.pause() работает, заключается в том, что явно запускает цикл событий графического интерфейса пользователя в течение заданного количества секунд.

Встроенный бэкэнд работает, потому что он просто создает статический png (поэтому _ всегда_ «мертвый»).

Спасибо за объяснение и связанный вопрос, Томас!

Думаю, этот PR решит эту проблему: https://github.com/ipython/ipykernel/pull/438

Отличная работа! Большое спасибо @ impact27!

Любое решение для этого? Я не могу закрыть фигуру после plt.pause (1). Я попробовал plt.close () и снова сделал паузу, но успеха. благодаря

Любое решение для этого? Я не могу закрыть фигуру после plt.pause (1). Я попробовал plt.close () и снова сделал паузу, но успеха. благодаря

Вы должны указать номер фигуры в качестве аргумента для plt.close() (или 'all' ). Решение на данный момент - plt.pause . Это будет решено, когда / если ipykernel объединит https://github.com/ipython/ipykernel/pull/438. Я лично использую модифицированную версию ipykernel с объединенной этой веткой.

Любое решение для этого? Я не могу закрыть фигуру после plt.pause (1). Я попробовал plt.close () и снова сделал паузу, но успеха. благодаря

Вы должны указать номер фигуры в качестве аргумента для plt.close() (или 'all' ). Решение на данный момент - plt.pause . Это будет решено, когда / если ipykernel объединит ipython / ipykernel # 438 . Я лично использую модифицированную версию ipykernel с объединенной этой веткой.

Это не сработало. Я запускаю plt.figure (1); plt.imshow (myimage); plt.pause (1); plt.close (1) и нет результатов. Я использую IPython 7.11.1, Spyder 4.0.1 и python 3.7.5

Я смог воспроизвести. Пожалуйста, откройте новый выпуск об этом. В качестве обходного пути вы можете закрыть их крестиком, пока они находятся под plt.pause

Я смог воспроизвести. Пожалуйста, откройте новый выпуск об этом. В качестве обходного пути вы можете закрыть их крестиком, пока они находятся под plt.pause

Этот обходной путь сработал. Это странно. Спасибо, в любом случае

Это проблема не только при отладке. У меня активирован встроенный бэкэнд. Вот минимальный рабочий пример:

import numpy as np
import matplotlib.pyplot as plt

x, y = np.random.rand(2, 5)

fig = plt.figure()

ax = fig.add_subplot(111)

ax.scatter(x, y)

Если в примере я «Запустить файл», появится встроенный график. Если я выберу весь пример и «Выполнить выделение или текущую строку», появится встроенный график. Если я выберу строки 1–6 и «Выполнить выделение или текущую строку» и наберу оставшуюся часть примера в консоли, график не появится. Ссылка на сюжетный объект действительно появляется.

Это проблема не только при отладке. У меня активирован встроенный бэкэнд. Вот минимальный рабочий пример:

import numpy as np
import matplotlib.pyplot as plt

x, y = np.random.rand(2, 5)

fig = plt.figure()

ax = fig.add_subplot(111)

ax.scatter(x, y)

Если в примере я «Запустить файл», появится встроенный график. Если я выберу весь пример и «Выполнить выделение или текущую строку», появится встроенный график. Если я выберу строки 1–6 и «Выполнить выделение или текущую строку» и наберу оставшуюся часть примера в консоли, график не появится. Ссылка на сюжетный объект действительно появляется.

Я не думаю, что это связано с этой ошибкой. Это одно из ограничений использования встроенной серверной части, которое не «перерисовывает» сам график. Если вам нужно явно построить что-то во встроенной серверной части, вы можете сделать:

from IPython.core.display import display
display(fig)

display(fig) работает. Тем не менее, противоречивое поведение между полным запуском файла и частичным запуском файла и завершением в консоли сбивает с толку.

@kdpenner - вы получите такое же поведение, например, в блокноте, если вы разделите код между ячейками, это ожидается. Но я не думаю, что для этого нужно использовать функцию display() . Набрав в консоли fig должна нарисовать фигуру.

fig тоже работает. Возможно, эта разница в поведении была задумана, но я, как пользователь, этого не ожидаю.

@kdpenner Я имел в виду, что вы получите такое же поведение в других средах со встроенным сервером, так что это не проблема для Spyder.

@mmagnuski Понятно. Спасибо за обходной путь fig .

🎉

Большое спасибо за исправление!

захватывающий!

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

Была ли эта страница полезной?
0 / 5 - 0 рейтинги