Qual é a maneira correta de depurar no notebook iPython?

121

Como eu sei, %debug magicpode fazer depuração dentro de uma célula.

No entanto, tenho chamadas de função em várias células.

Por exemplo,

In[1]: def fun1(a)
           def fun2(b)
               # I want to set a breakpoint for the following line #
               return do_some_thing_about(b)

       return fun2(a)

In[2]: import multiprocessing as mp
       pool=mp.Pool(processes=2)
       results=pool.map(fun1, 1.0)
       pool.close()
       pool.join

O que eu tentei:

  1. Eu tentei definir %debugna primeira linha da célula 1. Mas ele entra no modo de depuração imediatamente, mesmo antes de executar a célula 2.

  2. Eu tentei adicionar %debuga linha logo antes do código return do_some_thing_about(b). Mas o código é executado para sempre, nunca para.

Qual é a maneira correta de definir um ponto de interrupção no notebook ipython?

Rex
fonte

Respostas:

72

Use ipdb

Instale-o via

pip install ipdb

Uso:

In[1]: def fun1(a):
   def fun2(a):
       import ipdb; ipdb.set_trace() # debugging starts here
       return do_some_thing_about(b)
   return fun2(a)
In[2]: fun1(1)

Para executar o uso linha a linha ne para entrar em uma função, use se para sair do uso do prompt de depuração c.

Para obter uma lista completa dos comandos disponíveis: https://appletree.or.kr/quick_reference_cards/Python/Python%20Debugger%20Cheatsheet.pdf

Tevin Joseph KO
fonte
O ipdb não me fornece o prompt de depuração na outra célula com o código de exemplo mencionado na pergunta. Agora o código continua em execução para sempre.
Rex
@Rex Para mim, funciona. Onde você colocou o ipdb? Coloque import ipdb; ipdb.set_trace (); antes da linha, retorne do_some_thing_about (b). Em seguida, chame fun1 (a) da segunda célula, ele deve funcionar. Para sair do prompt de depuração, use 'c'
Tevin Joseph KO
@Rex Atualizou a resposta para obter mais clareza.
Tevin Joseph KO
29
Isso funciona no console do iPython, mas não no notebook do iPython (que é a pergunta feita). Quando digito import ipdb; ipdb.set_trace()em uma célula de notebook, ele diz #MultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
Bill
1
novo no jupyter ... parece que é mais adequado para apresentação e compartilhamento de trechos de código ... podemos ter funcionalidades que os IDEs (como eclipse, rstudio) fornecem como depuração real, passo a passo, pontos de interrupção, adição de observação à expressão e variáveis etc. no início, parece que não é o caso, só quero ter certeza .....
Mahesha999
90

Você pode usar o ipdbjupyter interno com:

from IPython.core.debugger import Tracer; Tracer()()

Edit : as funções acima estão obsoletas desde o IPython 5.1. Esta é a nova abordagem:

from IPython.core.debugger import set_trace

Adicione set_trace()onde você precisa de um ponto de interrupção. Digite helppara ipdbcomandos quando o campo de entrada aparecer.

Leopd
fonte
20
Tracerfoi depreciado. Agora, funciona desta maneira: from IPython.core.debugger import set_tracee set_trace()evoca um ponto de interrupção. Fonte: davidhamann.de/2017/04/22/debugging-jupyter-notebooks
Anton Tarasenko
1
Útil para usar como uma linha, sempre que necessário:from IPython.core.debugger import set_trace;set_trace()
Nir
15

Sua função de retorno está na linha de função def (função principal), você deve fornecer uma guia para ela. E use

%%debug 

ao invés de

%debug 

para depurar a célula inteira, não apenas a linha. Espero que talvez isso ajude você.

Mohit Khurana
fonte
12

Você sempre pode adicionar isso em qualquer célula:

import pdb; pdb.set_trace()

e o depurador irá parar nessa linha. Por exemplo:

In[1]: def fun1(a):
           def fun2(a):
               import pdb; pdb.set_trace() # debugging starts here
           return fun2(a)

In[2]: fun1(1)
Krock
fonte
Isso deveria ser ipdb?
Rex
1
@Rex Não necessariamente. ipdbé um refator do depurador Python que está mais intimamente integrado ao IPython. pdbé construído em.
Two-Bit Alchemist
ipdbtambém pode ser usado fora do shell do ipython e vem com algumas conveniências, como a conclusão de guias.
Janeiro
12

No Python 3.7, você pode usar a função breakpoint () . Basta entrar

breakpoint()

onde quer que você queira que o tempo de execução pare e a partir daí, você pode usar os mesmos comandos pdb (r, c, n, ...) ou avaliar suas variáveis.

Vlad Bezden
fonte
2
Para adicionar isso, quando você chama breakpoint (), pode digitar 'help' na caixa de texto que aparece para obter uma lista de comandos.
gbeaven
Parece haver um problema persistente de hang-up após o uso de breakpoint () ou PDB: github.com/ipython/ipython/issues/10516
Dave Liu
8

Basta digitar import pdbno caderno jupyter, e depois usar este cheatsheet para depurar. É muito conveniente.

c-> continue, s-> passo, b 12-> defina o ponto de interrupção na linha 12 e assim por diante.

Alguns links úteis: Documento oficial do Python sobre pdb , exemplos de depurador do Python pdb para entender melhor como usar os comandos do depurador .

Algumas capturas de tela úteis: insira a descrição da imagem aquiinsira a descrição da imagem aqui

flowera
fonte
Boa resposta. No entanto, acho que (eu sou novo no notebook Jupyter) deve-se adicionar% debug para definir um ponto de interrupção.
Ad Infinitum
O que faço é copiar e colar pdb.set_trace()no local em que quero definir um ponto de interrupção, pois o b line_nonão está funcionando no Jupyter Notebook e funciona bem no python IDLE.
Flowera
Obrigado! Também enviei algumas capturas de tela que testei hoje. Se eu pudesse mudar para Python IDLE Eu adoraria fazê-lo ..
Flowera
Além disso, encontro uma maneira de mostrar o número da linha no bloco de anotações do jupyter, clique em nova linha e, em seguida, pressione l.
Flowera
1
Eu sempre uso "p" para mostrar a lista de comandos no bloco de anotações Jupyter. Quando escrevo "show number numbers", o comando aparece lá com o atalho ao lado. Você também pode aprender o atalho do comando, que deseja usar.
Ad Infinitum
8

Depois de receber um erro, na próxima célula, execute %debuge é isso.

Escachator
fonte
1
isso é incrível!
Alguém
no entanto, isso deve esperar a exceção ocorrer, podemos querer testar qual é a variável no tempo de execução definindo algum ponto de interrupção
Luk Aron
7

O %pdbcomando mágico também é bom de usar. Basta dizer %pdb one, posteriormente, o pdbdepurador será executado em todas as exceções, independentemente da profundidade da pilha de chamadas. Muito conveniente.

Se você tem uma linha específica que deseja depurar, apenas crie uma exceção (geralmente você já está!) Ou use o %debugcomando mágico que outras pessoas têm sugerido.

à prova d'água
fonte
5

Acabei de descobrir o PixieDebugger . Mesmo pensando que ainda não tive tempo para testá-lo, realmente parece a maneira mais semelhante de depurar a maneira como usamos o ipython com o ipdb

insira a descrição da imagem aqui

Ele também tem uma guia "avaliar"

Alessandro Dentella
fonte
0

Um depurador nativo está sendo disponibilizado como uma extensão para o JupyterLab. Lançado há algumas semanas, isso pode ser instalado com a extensão relevante, assim como o kernel xeus-python (que vem notavelmente sem as mágicas conhecidas pelos usuários do ipykernel):

jupyter labextension install @jupyterlab/debugger
conda install xeus-python -c conda-forge

Isso permite uma experiência de depuração visual bem conhecida de outros IDEs.

insira a descrição da imagem aqui

Fonte: Um depurador visual para Jupyter

fuglede
fonte
O xeus-python não roda no meu Windows 10. Verifique meu problema xeus-python no github
sergzemsk 10/04