iPython 노트북에서 디버그하는 올바른 방법은 무엇입니까?


121

아시다시피 %debug magic한 셀 내에서 디버그를 할 수 있습니다.

그러나 여러 셀에 걸쳐 함수 호출이 있습니다.

예를 들면

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

내가 시도한 것 :

  1. 나는 %debugcell-1의 첫 번째 줄 을 설정하려고했습니다 . 그러나 cell-2를 실행하기 전에도 즉시 디버그 모드로 들어갑니다.

  2. %debug코드 바로 앞에 줄 을 추가하려고 했습니다 return do_some_thing_about(b). 그러나 코드는 영원히 실행되고 멈추지 않습니다.

ipython 노트북에서 중단 점을 설정하는 올바른 방법은 무엇입니까?

답변:


72

ipdb 사용

다음을 통해 설치하십시오.

pip install ipdb

용법:

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)

한 줄씩 실행 n하고 함수를 사용 s하고 디버깅 프롬프트를 종료하려면 c.

사용 가능한 명령의 전체 목록 : https://appletree.or.kr/quick_reference_cards/Python/Python%20Debugger%20Cheatsheet.pdf


ipdb는 질문에 언급 된 샘플 코드와 함께 다른 셀의 디버그 프롬프트를 제공하지 않습니다. 이제 코드는 영원히 계속 실행됩니다.
Rex

@Rex 나를 위해 그것은 작동합니다. ipdb를 어디에 넣었습니까? import ipdb를 넣으십시오. ipdb.set_trace (); 줄이 do_some_thing_about (b)를 반환하기 전에. 그런 다음 두 번째 셀에서 fun1 (a)를 호출하면 작동합니다. 디버깅 프롬 트를 종료하려면 'c'를 사용하십시오.
Tevin Joseph KO 2015

@Rex 더 명확하게 답변을 업데이트했습니다.
Tevin Joseph KO 2015

29
이것은 iPython 콘솔에서 작동하지만 iPython 노트북에서는 작동하지 않습니다 (질문이 질문 한 것입니다). 내가 입력하면 import ipdb; ipdb.set_trace()그것이 말하는 노트북 셀 내MultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.

1
jupyter의 새로운 기능 ... 프레젠테이션 및 코드 스 니펫 공유에 더 적합한 것 같습니다 ... IDE (eclipse, rstudio와 같은)가 실제 디버깅, 스텝 스루, 중단 점, 표현식에 시계 추가와 같은 제공하는 기능을 가질 수 있습니까? 변수 등. 처음에는 사실이 아닌 것 같습니다. 확인하고 싶습니다 .....
Mahesha999

90

ipdbjupyter 내부에서 다음과 같이 사용할 수 있습니다 .

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

편집 : 위의 기능은 IPython 5.1 이후로 더 이상 사용되지 않습니다. 이것이 새로운 접근 방식입니다.

from IPython.core.debugger import set_trace

set_trace()중단 점이 필요한 곳에 추가하십시오 . 입력 help에 대한 ipdb입력 필드가 나타나면 명령.


20
Tracer감가 상각되었습니다. 이제 다음 from IPython.core.debugger import set_trace과 같이 작동합니다 set_trace(). 중단 점을 불러 옵니다 . 출처 : davidhamann.de/2017/04/22/debugging-jupyter-notebooks
Anton Tarasenko 17

1
필요할 때마다 한 줄로 from IPython.core.debugger import set_trace;set_trace()
간편하게 사용

15

반환 함수는 def 함수 (주 함수) 줄에 있으므로 탭 하나를 제공해야합니다. 그리고 사용

%%debug 

대신에

%debug 

라인뿐만 아니라 전체 셀을 디버깅합니다. 희망, 아마도 이것이 당신을 도울 것입니다.


12

언제든지 모든 셀에 추가 할 수 있습니다.

import pdb; pdb.set_trace()

디버거가 해당 줄에서 중지됩니다. 예를 들면 :

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

In[2]: fun1(1)

ipdb 여야합니까?
Rex

1
@Rex 반드시 그런 것은 아닙니다. ipdbIPython과 더 밀접하게 통합 된 Python 디버거의 리 팩터입니다. pdb내장되어 있습니다.
두 비트의 연금술사

ipdbipython 셸 외부에서도 사용할 수 있으며 탭 완성과 같은 편의 기능이 제공됩니다.
1

12

Python 3.7에서는 breakpoint () 함수를 사용할 수 있습니다 . 그냥 입력

breakpoint()

런타임을 중지하고 싶을 때마다 동일한 pdb 명령 (r, c, n, ...)을 사용하거나 변수를 평가할 수 있습니다.


2
여기에 추가하려면 breakpoint ()를 호출 할 때 나타나는 텍스트 상자에 'help'를 입력하여 명령 목록을 가져올 수 있습니다.
gbeaven

breakpoint () 또는 pdb를 사용한 후 끊김
Dave Liu

8

그냥 입력 import pdbjupyter 노트북에, 다음이 사용 쪽지를 디버그. 매우 편리합니다.

c-> 계속, s-> 단계, b 12-> 12 행에 중단 점 설정 등.

일부 유용한 링크 : 파이썬 공식 문서 PDB에 , 파이썬 PDB 디버거의 예를 더 잘 이해하기위한 방법 디버거 명령을 사용하는 방법 .

유용한 스크린 샷 : 여기에 이미지 설명 입력여기에 이미지 설명 입력


좋은 대답입니다. 그러나 (저는 Jupyter 노트북을 처음 사용합니다) 중단 점을 설정하기 위해 % debug를 추가해야한다고 생각합니다.
Ad Infinitum

내가하는 일은 Jupyter Notebook에서 작동하지 않고 python IDLE에서 잘 작동하기 pdb.set_trace()때문에 중단 점을 설정하려는 위치에 복사하여 붙여 넣는 것 b line_no입니다.
flowera 2017-10-26

감사! 오늘 테스트 한 스크린 샷도 업로드했습니다. 파이썬 IDLE로 전환 할 수 있다면 그렇게하고 싶습니다 ..
싶습니다

또한 jupyter 노트북에서 줄 번호를 표시하는 방법을 찾고, 새 줄을 클릭 한 다음 l을 누릅니다. 물론 직접 바로 가기를 프로그래밍 할 수도 있으며 jupyter 노트북 웹 사이트에서 링크를 사용할 수 있습니다.
flowera 2017

1
Jupyter 노트북의 명령 목록을 표시하기 위해 항상 "p"를 사용합니다. "show line numbers"라고 쓰면 바로 가기 옆에 명령이 나타납니다. 사용하려는 명령의 바로 가기를 배울 수도 있습니다.
Ad Infinitum

8

오류가 발생하면 다음 셀에서 실행 %debug하면됩니다.


1
굉장합니다!
Someone

그러나, 이것은 우리가 일부 중단 점을 설정하여 런타임에서 변수 무엇인지 테스트 할 수 있습니다, 발생하는 예외를 기다려야합니다
눅 아론

7

%pdb마법 명령 뿐만 아니라 사용하는 것이 좋다. 그냥 말해%pdb on 하고 이후에 pdb디버거가 호출 스택에 얼마나 깊은 상관없이, 모든 예외에서 실행되지 않습니다. 매우 편리합니다.

디버그하려는 특정 라인이있는 경우 예외를 발생 시키거나 (종종 이미 있습니다!) %debug다른 사람들이 제안한 마법 명령을 사용하십시오 .



0

네이티브 디버거가 JupyterLab의 확장으로 제공되고 있습니다. 몇 주 전에 릴리스 된이 파일은 관련 확장과 xeus-python 커널 (특히 ipykernel 사용자에게 잘 알려진 마법없이 제공됨)을 가져 와서 설치할 수 있습니다.

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

이를 통해 다른 IDE에서 잘 알려진 시각적 디버깅 환경을 사용할 수 있습니다.

여기에 이미지 설명 입력

출처 : Jupyter 용 비주얼 디버거


xeus-python이 내 Windows 10에서 실행되지 않습니다. 내 문제 확인 xeus-python 문제 on github
sergzemsk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.