_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_
_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_
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:
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_
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:
_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 .
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').