Spyder: Incapaz de ver os gráficos feitos com Matplotlib durante a depuração

Criado em 17 fev. 2015  ·  47Comentários  ·  Fonte: spyder-ide/spyder

_De al.dan ... @ gmail.com em 2011-04-12T17: 33: 50Z_

Este script, quando executado no spyder, funciona bem e produz um gráfico de contorno:

#! / usr / bin / env python
from matplotlib.pyplot import imshow, show
importar numpy como np
x = np.random.rand (4,5)
imshow (x)
exposição()

No entanto, se eu entrar no modo de depuração e colocar um ponto de interrupção na linha imshow (x), digite manualmente os comandos imshow (x) e show () no prompt (Pdb), nenhum gráfico aparecerá. Eu só recebo uma referência ao objeto do enredo:

(Pdb) imshow (x)

(Pdb) show ()
(Pdb)

Seria um bom aprimoramento ser capaz de plotar variáveis ​​no modo de depuração.

Python 2.7.1
NumPy 1.5.1
matplotlib 1.0.1 (backend WXAgg)
RHEL 4.8 x86_64

_Problema original: http://code.google.com/p/spyderlib/issues/detail?id=620_

11–20 stars Debugger Bug

Comentários muito úteis

Consulte https://github.com/matplotlib/matplotlib/pull/4779 para os detalhes sangrentos.

A versão muito curta, para que a GUI seja responsiva, seu loop de eventos (que é essencialmente um loop infinito aguardando E / S do usuário) precisa estar em execução. O prompt de depuração também está em loop infinito, esperando que o usuário digite. No prompt 'normal', é feito um trabalho de integração delicado para permitir que esses dois loops sejam compartilhados (basicamente, o prompt permite que o loop da GUI seja executado até que uma única tecla seja pressionada, processe as teclas e reinicie o loop de eventos da GUI). No prompt de depuração, essa integração não é feita e a figura parece 'morta'. Isso afetará qualquer janela baseada em GUI.

A razão de chamar plt.pause() funcionar é que explicitamente executa o loop de eventos da GUI por um determinado número de segundos.

O back-end embutido funciona porque apenas produz um PNG estático (então _sempre_ está 'morto').

Todos 47 comentários

_De al.dan ... @ gmail.com em 2011-04-12T15: 40: 57Z_

Esqueci de acrescentar que isso é com spyder 2.0.8 e ipython 0.10.1.
Além disso, o backend quando o spyder é executado é o Qt4Agg. Eu obtenho WXAgg quando executo o ipython diretamente de uma janela de terminal (ou seja, independentemente do spyder).

_De ccordoba12 em 2011T19 : 31: 44Z_

Rótulos: Cat-Debugger

_De ccordoba12 em 2011-08-16T11: 41: 02Z_

o problema # 733 foi incorporado a este problema.

_De eigenjoh ... @ gmail.com em 2011-11-10T07: 23: 21Z_

esta correção tornaria este aplicativo um matlab killer

_De kavaldj ... @ gmail.com em 2013-05-12T21: 43: 03Z_

Isso foi corrigido ou resolvido de alguma forma?

Eu concordo com o comentário #4 : isso tornaria o Spyder mais perto de um assassino de ML

_De contrebasse em 2013-05-13T00: 37: 52Z_

1: isso é normal, o back-end padrão para matplotlib é WXAgg. Você pode alterá-lo em seu script:

importar matplotlib
matplotlib.use ('Qt4Agg', warn = False)

_De jed.lud ... @ gmail.com em 2013-05-13T07: 45: 45Z_

Diagnósticos recentes adicionais depois de fazer mais alguns testes:

  • A plotagem falha durante a depuração dentro do Spyder quando o script é executado dentro da sessão Python interativa atual ou sessão IPython interativa. Isso é verdadeiro para back-ends Qt4Agg ou WXAgg.
  • A plotagem durante a depuração funciona bem no Spyder se o script estiver configurado para ser executado em seu próprio interpretador Python dedicado. Isso também é independente do back-end.
  • A plotagem durante a depuração funciona bem em uma sessão de "ipython qtconsole" quando executada em um console do sistema.

Soyder 2.3.0dev (revisão 0bb65fdb4b6e)
Python 2.7.3 de 32 bits
IPython 0.13.2
Matplotlib 1.2.0
Windows 7 (64 bits)

_De kavaldj ... @ gmail.com em 2013-05-14T13: 45: 31Z_

8 Jed, obrigado !!

Executar o debug em um intérprete dedicado funciona para mim, obrigado pela ótima dica!

Peço desculpas se pareço ganancioso, mas existe uma maneira simples de tornar a figura não modal?

No momento, ele bloqueia o interpretador, pois está interrompido no Pdb, pode haver outro truque que eu possa usar? Estou apenas chamando imshow (data), show ().

Muito obrigado antecipadamente!
dan

_De jed.lud ... @ gmail.com em 2013-05-14T16: 55: 16Z_

@ -kavaldijiev: Tornar a figura não modal é a peça difícil de resolver. Parece que Carlos procurou resolver isso no problema # 733, e pode não ser simples sem algum trabalho de thread interessante. Provavelmente tem algo a ver com o modo interativo do matplotlib ter que ser executado em paralelo com o pdb, e você teria que descobrir como fazer com que esses threads cooperassem.

Observe que se você estiver tentando plotar durante a depuração no console IPython Qt, ele também será bloqueado após a emissão do comando "show ()". Não é totalmente interativo lá também.

Executar em um intérprete dedicado parece ser a melhor solução por enquanto.

_De kavaldj ... @ gmail.com em 2013-05-15T14: 54: 57Z_

@ -jed Obrigado pela explicação detalhada!

Vou administrar com figuras modais. Mas definitivamente vale a pena fazê-lo funcionar a longo prazo, pois pode ser extremamente atraente para o público do MATLAB.

_De jed.lud ... @ gmail.com em 2013-05-16T07: 57: 29Z_

@ -kavaldijiev: Depois de um pouco mais de investigação, há outra solução alternativa que deve fornecer uma maneira de plotar interativamente durante a depuração. Parece que são provavelmente os componentes da GUI do Qt que estão atrapalhando a plotagem interativa. Se você executar o IPython _sem_ a interface do console Qt, a plotagem interativa funcionará durante a depuração _sem_ do bloqueio. Aqui estão os comandos:

  1. Abra um Prompt de Comando e vá para o diretório onde está seu script.
  2. Execute "ipython --pylab" no prompt.
  3. Dentro do IPython, execute "% run -d.py "
  4. Agora você deve ser capaz de percorrer o código usando comandos pdb, plotar usando imshow () e o gráfico deve ser desenhado sem bloquear a entrada da linha de comando.

_De jed.lud ... @ gmail.com em 2013-05-16T15: 11: 32Z_

E, depois de um pouco mais de pesquisa, encontrei esta resposta: http://stackoverflow.com/questions/12822762/pylab-ion-in-python-2-matplotlib-1-1-1-and-updating-of-the -plot-while-the-pro / 12826273 # 12826273 Portanto, se o código na postagem original for modificado desta maneira:

from matplotlib.pyplot import imshow, pause
importar numpy como np
x = np.random.rand (4,5)
imshow (x)
pausa (1)

você pode fazer com que a trama seja atualizada, interativamente, dentro de um console interativo do Spyder durante a depuração sem bloquear! Portanto, use pause (1) em vez de show (). O gráfico só se torna interativo durante a pausa, então se você quiser mais tempo para ampliar ou deslocar os dados, use pausa (10) ou pausa (20). Funciona no console IPython Qt também.

_De kavaldj ... @ gmail.com em 2013-05-16T22: 35: 04Z_

@ -jed, obrigado, os dois métodos funcionam!

O método do prompt de comando parece mais robusto - posso fechar as figuras abertas, e as figuras podem obter o foco (para zoom, etc) até fechar.

O método de pausa é obviamente preferível, pois está dentro do Spyder. A pausa retorna o controle do teclado, mas a janela não deve ser fechada, caso contrário, o intérprete trava. Abrir mais novas figuras é trêmulo - às vezes dá certo, outras vezes não, mas eu não gastei muito tempo testando.

Em qualquer caso, qualquer um deles é extremamente útil para depuração, mesmo não tão fácil e robusto como o ML.

Felicidades,
dan

_De al.dan ... @ gmail.com em 2013-05-19T21: 08: 30Z_

Fico feliz em ver progresso depois de alguns anos. Sim, o truque de pausa (n) funciona bem para mim. Obrigado, @ -jed, por seguir em frente com uma solução!

_De jed.lud ... @ gmail.com em 2013-05-20T09: 13: 28Z_

Não posso receber muito crédito por nada além da investigação. A função pause (n) é um recurso matplotlib que acabei de descobrir.

Em última análise, a raiz desse problema é realmente a interação entre os loops de eventos de desenho de matplotlib e os loops de eventos de aplicativos Qt, e não tenho certeza se há realmente uma solução "Spyder" para isso. Provavelmente, deve ser tratado no nível matplotlib. Como evidência disso, o IPython rodando em consoles Qt sofre essas mesmas limitações.

_De jason.bo ... @ gmail.com em 2014-07-07T05: 33: 04Z_

Este problema parece ter sido resolvido no IEP: https://bitbucket.org/iep-project/iep/issue/297/interactive-plotting-is-not-working-during

_De ccordoba12 em

a edição nº 1848 foi incorporada a esta edição.

Eu estava pensando se alguém poderia me dar uma pequena perspectiva de para onde estamos indo com tudo isso. Eu suspeito que não sou o único por aí que passou muito tempo usando Matlab e é muito atraído pelo mundo Python por várias razões e sentidos que a verdadeira produtividade está terrivelmente perto, mas como uma miragem parece estar sempre fora de alcance. A solução alternativa pause () é ótima e a capacidade de resposta da equipe do Spyder é realmente impressionante. E agora que o problema do editor lento no El Capitan aparentemente foi eliminado no 3.0 beta, tudo parece tão próximo. E ainda ...

Então, para onde um especialista acha que isso vai levar? Pelo que pude perceber, uma grande parte do problema é o próprio Matplotlib. E também concluo que o guiqwt também não está em boa forma agora. Então, as pessoas acham que estamos caminhando para uma situação em que podemos depurar em um IDE, acertar pontos de interrupção e fazer plotagem interativa a partir dos pontos de interrupção, tudo de forma contínua? Acho que é isso que todos os ex-usuários do Matlab desejam, e alguns de nós estão se perguntando se deveríamos desembolsar os $ 200 para o Matlab Home Edition, voltando ao Borg e abandonando a abordagem Python e o apelo do software baseado na comunidade e o Linguagem Python.

Pode parecer que estou reclamando, mas, na verdade, estou apenas tentando descobrir como investir meu tempo. Eu realmente quero que o jeito Python seja o matador de Matlab que poderia ser ...

@jandyman , por favor, não se desespere :-) Estamos fazendo uma reorganização / limpeza massiva para o Spyder 3.0 que seria muito benéfico para o Spyder 4.0, onde planejamos resolver esse problema.

O verdadeiro problema não é com Matplotlib, é com a arquitetura IPython / Jupyter que bloqueia o console durante a depuração, impedindo-nos de executar uma sessão de depuração com mais recursos (com navegação e gráficos de histórico) como no Matlab.

Mas deixe-me garantir que, após o lançamento do 3.0 (em um mês ou mais), todos os nossos esforços serão direcionados para resolver os muitos problemas de depuração pendentes e desagradáveis ​​que o Spyder tem. Se tudo correr bem e tivermos sucesso, planejamos lançar nossas correções no 4.0 (como eu disse) até o final do ano ou no início do próximo :-)

Também percebi que o guiqwt também não está em ótima forma agora

Esse é um projeto @PierreRaybaut (o mesmo que criou o Spyder). Infelizmente, ele não tem muito tempo para código aberto ultimamente :-(

Também percebi que o guiqwt também não está em ótima forma agora

Esse é um projeto @PierreRaybaut (o mesmo que criou o Spyder). Infelizmente, ele não tem muito tempo para código aberto ultimamente :-(

@ ccordoba12 , @jandyman : Isso mesmo, infelizmente.
No entanto, fiz um trabalho significativo recentemente no guiqwt: Resolvi o problema de obsolescência do PyQwt reimplementando-o em Python puro (consulte o projeto PythonQwt ) para que o guiqwt v3 não dependa mais do PyQwt. Não acho que guiqwt esteja em mau estado agora: graças aos desenvolvimentos recentes, ele funciona em Python 2.7, 3.0-3.5 e com Qt4-Qt5. Mas o projeto não está crescendo, pois não tenho tempo para gerenciá-lo (ou seja, criar novos recursos, divulgar a biblioteca, etc.) - Estou apenas fazendo manutenção, para que os recursos atuais continuem funcionando como antes. Como está, observe que ainda tem muito mais desempenho do que matplotlib (ou MATLAB) para mostrar e manipular imagens grandes em tempo real (zomming / panning, ajuste de contraste, plotagem de seções transversais, etc.), por exemplo, e é um caminho à frente matplotlib em relação à interatividade.

Com relação ao post original de @ ccordoba12 mencionou, o Spyder agora depende do IPython / Jupyter: isso é ótimo, pois habilitou muitos recursos novos, mas também tem suas desvantagens.
De qualquer forma, não vejo porque não seria possível interagir da mesma forma no Spyder do que no MATLAB.

Olá a todos,

Sou um dos usuários que mudou do MATLAB para o Python. Acho que o Spyder é um ótimo IDE, mas o problema de não plotagem interativa durante a depuração é uma desvantagem importante para as pessoas que vêm do MATLAB.

Acho que não deve ser tão difícil resolvê-lo. Por exemplo, estou executando o IPython de um terminal do sistema (sem qtConsole) e posso fazer plotagem interativa (guiqwt) perfeitamente, seja a partir de sessões IPython ou ipdb. Além disso, tenho histórico de comandos durante a depuração. Eu acho que se você apenas substituir (ou adicionar a opção) de executar ipython de um terminal (sem qtConsole), esse problema será resolvido.

Por favor, tente consertar isso, pois eu acho que é a única coisa que está impedindo muitas pessoas de usar o Spyder.

Obrigado,

Felipe

Acho que não deve ser tão difícil resolvê-lo.

Isto é. As bibliotecas e tecnologias usadas por IPython no terminal e qtconsole são completamente diferentes.

Por nada este bug foi aberto por 5 anos, e ainda será por mais algum tempo ;-)

Eu preciso desse recurso porque uso o Spyder como o IDE principal para desenvolver algoritmos de processamento de imagem, visualizar as imagens durante a depuração é uma solicitação de recurso muito comum.

Eu também gostaria, eu uso o Spyder principalmente para depuração.

@mmagnuski , isso é possível agora usando a magia %plot durante a depuração, como esta

%plot plt.plot(range(10))

Mas para que isso funcione, você precisa definir seu back-end Matplotlib para Inline .

@tacaswell Eu estava conversando com @WeatherGod e ele achou que você poderia

Seria legal se isso funcionasse "perfeitamente", embora eu entenda que é difícil.

Por enquanto, eu uso o truque pause(10) .

Consulte https://github.com/matplotlib/matplotlib/pull/4779 para os detalhes sangrentos.

A versão muito curta, para que a GUI seja responsiva, seu loop de eventos (que é essencialmente um loop infinito aguardando E / S do usuário) precisa estar em execução. O prompt de depuração também está em loop infinito, esperando que o usuário digite. No prompt 'normal', é feito um trabalho de integração delicado para permitir que esses dois loops sejam compartilhados (basicamente, o prompt permite que o loop da GUI seja executado até que uma única tecla seja pressionada, processe as teclas e reinicie o loop de eventos da GUI). No prompt de depuração, essa integração não é feita e a figura parece 'morta'. Isso afetará qualquer janela baseada em GUI.

A razão de chamar plt.pause() funcionar é que explicitamente executa o loop de eventos da GUI por um determinado número de segundos.

O back-end embutido funciona porque apenas produz um PNG estático (então _sempre_ está 'morto').

Obrigado pela explicação e pelo problema relacionado, Thomas!

Acho que esse PR resolveria: https://github.com/ipython/ipykernel/pull/438

Ótimo trabalho! Muito obrigado @ impact27!

Alguma solução para isso? Não consigo fechar a figura após plt.pause (1). Eu tentei plt.close () e pausei novamente, mas tive sucesso. obrigado

Alguma solução para isso? Não consigo fechar a figura após plt.pause (1). Eu tentei plt.close () e pausei novamente, mas tive sucesso. obrigado

Você tem que dar o número da figura como um argumento para plt.close() (ou 'all' ). A solução por enquanto é plt.pause . Será resolvido quando / se o ipykernel mesclar https://github.com/ipython/ipykernel/pull/438. Eu pessoalmente uso uma versão modificada do ipykernel com este ramo mesclado.

Alguma solução para isso? Não consigo fechar a figura após plt.pause (1). Eu tentei plt.close () e pausei novamente, mas tive sucesso. obrigado

Você tem que dar o número da figura como um argumento para plt.close() (ou 'all' ). A solução por enquanto é plt.pause . Será resolvido quando / se ipykernel mesclar ipython / ipykernel # 438 . Eu pessoalmente uso uma versão modificada do ipykernel com este ramo mesclado.

Não funcionou. Eu executo plt.figure (1); plt.imshow (minhaimagem); plt.pause (1); plt.close (1) e nenhum resultado. Estou usando IPython 7.11.1, Spyder 4.0.1 e python 3.7.5

Consegui reproduzir. Por favor, abra uma nova edição sobre isso. Como alternativa, você pode fechá-los com a cruz enquanto estiver abaixo de plt.pause

Consegui reproduzir. Por favor, abra uma nova edição sobre isso. Como alternativa, você pode fechá-los com a cruz enquanto estiver abaixo de plt.pause

Esta solução alternativa funcionou. Isso é estranho. Obrigado mesmo assim

Isso não é apenas um problema durante a depuração. Eu tenho o back-end embutido ativado. Aqui está um exemplo de trabalho mínimo:

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)

Se eu "Executar arquivo" no exemplo, um gráfico embutido aparece. Se eu selecionar todo o exemplo e "Executar seleção ou linha atual", um gráfico embutido aparece. Se eu selecionar as linhas 1 a 6 e "Executar seleção ou linha atual" e digitar o restante do exemplo no console, nenhum gráfico aparecerá. A referência ao objeto de plotagem aparece.

Isso não é apenas um problema durante a depuração. Eu tenho o back-end embutido ativado. Aqui está um exemplo de trabalho mínimo:

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)

Se eu "Executar arquivo" no exemplo, um gráfico embutido aparece. Se eu selecionar todo o exemplo e "Executar seleção ou linha atual", um gráfico embutido aparece. Se eu selecionar as linhas 1 a 6 e "Executar seleção ou linha atual" e digitar o restante do exemplo no console, nenhum gráfico aparecerá. A referência ao objeto de plotagem aparece.

Não acho que isso esteja relacionado a esse bug. Esta é uma limitação do uso do back-end embutido que o gráfico não "redesenha" sozinho. Se precisar traçar algo explicitamente no back-end embutido, você pode fazer:

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

display(fig) funciona. Ainda assim, o comportamento inconsistente entre a execução total de um arquivo e a execução parcial de um arquivo e a finalização no console é confuso.

@kdpenner - você obterá o mesmo comportamento, por exemplo no notebook, se dividir o código entre as células, isso é o esperado. Mas eu não acho que você precise usar a função display() para isso. Digitar fig no console deve desenhar a figura.

fig também funciona. Talvez essa diferença de comportamento tenha sido projetada, mas não é o que eu, como usuário, espero.

@kdpenner O que eu quis dizer é que você obterá o mesmo comportamento em outros ambientes com back-end embutido, portanto, este não é um problema com o Spyder.

@mmagnuski Entendido. Obrigado pela solução alternativa fig .

🎉

Muito obrigado por consertar isso!

emocionante!

Você pode ler sobre isso e outras melhorias em nosso depurador que foram lançadas na versão 4.2.0 aqui .

Esta página foi útil?
0 / 5 - 0 avaliações