programing

IPython을 사용한 단계별 디버깅

showcode 2023. 6. 9. 22:09
반응형

IPython을 사용한 단계별 디버깅

제가 읽은 바로는 파이썬에서 코드를 디버깅하는 데는 두 가지 방법이 있습니다.

  • 다음과 같은 기존 디버거를 사용할 수 있습니다.pdb또는ipdb은 " 이다음과같명지다니원합령을은는"와 을 지원합니다.c위해서continue,n위해서step-over,s위해서step-into등), 그러나 개체 검사에 매우 유용할 수 있는 IPython 셸에 직접 액세스할 수 없습니다.

  • 코드에 IPthon 셸을 포함하여 IPthon을 사용합니다.할수있습니다from IPython import embed그런 다음 사용합니다.embed()당신의 코드로.프로그램/스크립트가 실행될 때embed()진술, 당신은 IPython 쉘로 떨어집니다.이를 통해 모든 IPthon Goodies를 사용하여 개체를 전체적으로 검사하고 Python 코드를 테스트할 수 있습니다., 단을 사용할는 사를 합니다.embed()편리한 키보드 단축키로는 더 이상 코드를 단계별로 살펴볼 수 없습니다.

두 세계의 장점을 결합할 수 있는 방법이 있습니까?예.

  1. 편리한 pdb/ipdb 키보드 단축키를 사용하여 코드를 단계별로 살펴볼 수 있습니다.
  2. 이러한 단계(예: 지정된 문)에서 완전한 IPython 셸에 액세스할 수 있습니다.

MATLAB에서와 같은 IPython 디버깅:

이러한 유형의 "향상된 디버깅"의 예는 MATLAB에서 찾을 수 있습니다. 사용자는 항상 MATLAB 엔진/쉘에 대한 전체 액세스 권한을 가지고 있으며 코드를 단계별로 정의하고 조건부 중단점을 정의할 수 있습니다.제가 다른 사용자들과 논의한 바로는, 이것은 사람들이 MATLAB에서 IPython으로 이동할 때 가장 그리워하는 디버깅 기능입니다.

Emacs 및 기타 편집기의 IPython 디버깅:

질문을 너무 구체적으로 하고 싶지는 않지만, 저는 주로 Emacs에서 일하는데, 이 기능을 도입할 수 있는 방법이 없을까 생각합니다.이상적으로 Emacs(또는 편집기)는 프로그래머가 코드의 어느 곳에서든 중단점을 설정하고 인터프리터 또는 디버거와 통신하여 선택한 위치에서 중지되도록 하고 해당 위치의 완전한 IPython 인터프리터로 가져올 수 있습니다.

ipdb는 어떻습니까?set_http://timeout?코드에서:

import ipdb; ipdb.set_trace()

업데이트: 이제 Python 3.7에서 우리는 쓸 수 있습니다.breakpoint()동일하게 작동하지만, 또한 다음 사항을 준수합니다.PYTHONBREAKPOINT환경 변수입니다.이 기능은 PEP에서 제공됩니다.

할 수 , " ▁as▁such▁this,다니있▁to▁commands▁access▁allows▁have습수▁and▁you▁code이▁inspect▁for"와 같은 명령어를 사용할 수 있습니다.c (으), (계속)n줄에 ), (으)로 표시됩니다.s(해당 메소드에 단계적으로 삽입) 등입니다.

ipdb repo명령 목록을 참조하십시오.IPython은 이제 (편집: 의 일부) Jupyter라고 불립니다.


은 python.ps : ipdb 명령보다 합니다.그래서 글을 쓰기 위해서는list(foo)당신은 필요할 것입니다.print(list(foo))또는!list(foo).

또한 ipython 프롬프트(이메일 및 vim 모드, 이력, 완료 등)를 좋아한다면 python 프롬프트 툴킷을 기반으로 하기 때문에 프로젝트에서 동일한 것을 쉽게 얻을 수 있습니다.

아이피톤의 마법을 사용할 수 있습니다.그냥 전화하세요.%pdb으로 IPython으로 됩니다.ipdb밟지는 , 당장발디틈없동안는당은, 신딜이은에 있습니다.ipdb사후에

이렇게 하면 파일을 로드하기만 하면 되므로 개별 기능을 쉽게 디버깅할 수 있습니다.%load그런 다음 함수를 실행합니다.오류를 강제로 발생시킬 수 있습니다.assert적당한 위치에

%pdb라인 매직입니다.라고 부릅니다.%pdb on,%pdb 1,%pdb off또는%pdb 0인수 없이 호출하면 토글로 작동합니다.

(2016년 5월 28일 업데이트) Emacs에서 RealGUD 사용

Emacs의 모든 사용자를 위해, 스레드는 다음을 사용하여 OP에 설명된 모든 것을 달성하는 방법을 보여줍니다.

  1. RealGUD라고 불리는 Emacs의 새로운 중요한 디버거는 모든 디버거와 함께 작동할 수 있습니다.ipdb).
  2. 패키지 Emacs 파일isend-mode.

이 두 패키지의 조합은 매우 강력하며 OP에 설명된 동작을 정확하게 재현하고 더 많은 작업을 수행할 수 있습니다.

ipdb용 RealGUD의 위키 기사에 대한 자세한 정보.


원답:

이 스레드에 언급된 모든 것을 포함하여 Python을 디버깅하기 위한 많은 다양한 방법을 시도한 후, IPython을 사용하여 Python을 디버깅하는 제가 선호하는 방법 중 하나는 내장된 셸을 사용하는 것입니다.

내장된 사용자 지정 IPthon 셸 정의:

합니다.PYTHONPATH 그 방법은 그법방이.ipsh()를 사용할 수 있습니다.

import inspect

# First import the embed function
from IPython.terminal.embed import InteractiveShellEmbed
from IPython.config.loader import Config

# Configure the prompt so that I know I am in a nested (embedded) shell
cfg = Config()
prompt_config = cfg.PromptManager
prompt_config.in_template = 'N.In <\\#>: '
prompt_config.in2_template = '   .\\D.: '
prompt_config.out_template = 'N.Out<\\#>: '

# Messages displayed when I drop into and exit the shell.
banner_msg = ("\n**Nested Interpreter:\n"
"Hit Ctrl-D to exit interpreter and continue program.\n"
"Note that if you use %kill_embedded, you can fully deactivate\n"
"This embedded instance so it will never turn on again")   
exit_msg = '**Leaving Nested interpreter'

# Wrap it in a function that gives me more context:
def ipsh():
    ipshell = InteractiveShellEmbed(config=cfg, banner1=banner_msg, exit_msg=exit_msg)

    frame = inspect.currentframe().f_back
    msg   = 'Stopped at {0.f_code.co_filename} at line {0.f_lineno}'.format(frame)

    # Go back one level! 
    # This is needed because the call to ipshell is inside the function ipsh()
    ipshell(msg,stack_depth=2)

다음 코드에서 마다 그런다코서디버고싶때다마을하깅음에드때다를 배치합니다.ipsh()물체 검사 등을 해야 하는 곳에서 바로.를 들어, "Debug I debug " "라고 .my_function 이하로

사용:

def my_function(b):
  a = b
  ipsh() # <- This will embed a full-fledged IPython interpreter
  a = 4

그리고 나서 나는 명령을 내립니다.my_function(2)다음 중 하나의 방법으로:

  1. 유닉스 셸에서 이 함수를 호출하는 파이썬 프로그램을 실행함으로써
  2. 또는 IPython에서 직접 호출함으로써

내가 어떻게 그것을 호출하든, 통역사는 다음과 같은 줄에서 멈춥니다.ipsh()작업이 완료되면 다음 작업을 수행할 수 있습니다.Ctrl-D그리고 Python은 실행을 재개할 것입니다(사용자가 수행한 모든 변수 업데이트 포함).일반 IPython 셸에서 코드를 실행하는 경우(위의 사례 2), 새 IPython 셸은 호출한 IPython 셸 내부에 중첩됩니다. 이는 문제가 없지만 알아두는 것이 좋습니다.어느 쪽이든, 일단 통역사가 위치에 멈추면,ipsh는 의가를검수있다니의 할 수 .a(어느 쪽인가 하면)2),

문제:

위의 솔루션을 사용하여 Python이 코드의 원하는 위치에서 중지한 다음 완전한 IPython 인터프리터로 이동할 수 있습니다.유감스럽게도 스크립트를 호출하면 중단점을 추가하거나 제거할 수 없으므로 매우 답답합니다.제 생각에는, 이것이 IPython이 Python의 훌륭한 디버깅 도구가 되는 것을 막는 유일한 방법입니다.

현재 할 수 있는 최선의 방법:

방법은 해결방다같습다니과를 하는 것입니다.ipsh() 쉘 파썬리인터가프셸 IPthon 다을른위치의즉시할작터이i▁a즉(▁priorth위)▁a의,치다른파▁▁the▁at▁where, a)을 breakpoint 미리 정의된 코딩된 서로 다른 를 할 수 있습니다. "점프"할 수 Ctrl-D는 현재 가 다음 됩니다.ipsh().

" 모드종료하고 모든 하는 한 은 "debugging mode"를 사용하는 입니다.ipshell.dummy_mode = True은 Python의 후속 .ipshell위에서 만든 개체입니다.

pudb에서 IPython 세션을 시작하고 원하는 대로 디버깅 세션으로 돌아갈 수 있습니다.

을 사용하고 TAB 및 할 수 .%). ipdb 가 괜 다 과 음 같 은 명 사 IPython 습 있 니 다 수 할 작 시 에 서 찮 하다와 같은 할 수 %run그리고.%debug수. ipdb 세 션 서 내 점 서 로 IPython 션 다 검사를 되었습니까? ipdb " 체검에사 " 락입니 " 된무것 " 엇까은 누객서 에니? 입까에 엇무▁what?

또한 Emacs >= 24.3과 번들로 제공되는 python.el은 ipdb를 지원합니다.

@gaborous의 대답에서 접근법은 사용되지 않는 것 같습니다.

새로운 접근 방식은 다음과 같습니다.

from IPython.core import debugger
debug = debugger.Pdb().set_trace

def buggy_method():
    debug()

pdb에 입력하는 명령 앞에 "!" 기호를 붙이면 IPython 셸에서 무언가를 수행하는 것과 같은 효과가 있습니다.이 기능은 특정 함수 또는 변수 이름에 대한 도움말에 액세스하는 데 사용됩니다.아마도 이것이 당신에게 어느 정도 도움이 될 것입니다.예를들면,

ipdb> help(numpy.transpose)
*** No help on (numpy.transpose)

그러나 !help(numpy.transpose)를 사용하면 numpy.transpose에서 예상되는 도움말 페이지가 제공됩니다.마찬가지로 변수 이름의 경우 변수 l이 있다고 가정하면 pdb에 "l"을 입력하면 코드가 나열되지만 !l은 l 값을 출력합니다.

시작할 수 있습니다.IPython 에서. ipdb.

를 합니다.ipdb디버거1:

import idpb; ipdb.set_trace()

내부에서 IPython을 입력합니다.ipdb>콘솔2:

from IPython import embed; embed()

ipdb>내에서솔 내에서 IPython:

exit

운이 좋게도 Emacs를 사용할 수 있다면 더 편리하게 만들 수 있습니다.

이 경우 다음을 사용해야 합니다.M-x shell bm을 사용하여 다음 스니펫을 정의합니다.텍스트를 대체합니다.ipdb의 에서.set-trace에 띄고 수 있습니다. 스니펫을 삽입하면 라인이 강조 표시되어 쉽게 눈에 띄고 탐색할 수 있습니다.사용하다M-x bm-next탐색할 수 있습니다.

# -*- mode: snippet -*-
# name: ipdb
# key: ipdb
# expand-env: ((yas-after-exit-snippet-hook #'bm-toggle))
# --
import ipdb; ipdb.set_trace()

1 한 줄로 모두 연결하여 쉽게 삭제할 수 있습니다.부터imports한 번만 발생하면, 이 양식은 보장합니다.ipdb추가 오버헤드 없이 필요할 때 가져올 수 있습니다.

2 가져오기를 통해 입력 내용을 저장할 수 있습니다.IPython 파일 내:

try:
    from IPython import embed
except:
    pass

이렇게 하면 간단히 전화를 걸 수 있습니다.embed()에서.ipdb(물론 IPython이 설치된 경우에만 해당).

질문에 대한 정확한 답은 %run 매크로를 -d 플래그와 함께 사용하는 것입니다.

In [4]: run -d myscript.py
NOTE: Enter 'c' at the ipdb>  prompt to continue execution.        
> /cygdrive/c/Users/mycodefolder/myscript.py(4)<module>()
      2                                                            
      3                        
----> 4 a=1                                            
      5 b=2

팁을 사용해 보셨습니까?

또는 ipython을 사용하여 다음을 호출하는 것이 좋습니다.

from IPython.Debugger import Tracer; debug_here = Tracer()

그러면 그냥 사용할 수 있습니다.

debug_here()

중단점을 설정할 때마다

한 가지 옵션은 디버깅하는 동안 코드와 상호 작용할 수 있는 Spyder와 같은 IDE를 사용하는 것입니다(실제로 IPython 콘솔 사용).사실 Spyder는 MATLAB와 매우 유사합니다. 저는 이것이 의도적이었다고 생각합니다.여기에는 변수 검사기, 변수 편집, 문서에 대한 기본 제공 액세스 등이 포함됩니다.

inbed() 콘솔에 exit()를 입력하면 코드가 계속 진행되고 다음 inbed() 행으로 이동합니다.

Pyzo IDE는 OP가 요청한 것과 유사한 기능을 가지고 있습니다.디버그 모드로 시작할 필요는 없습니다.MATLAB과 마찬가지로 명령은 셸에서 실행됩니다.일부 소스 코드 줄에 중단점을 설정하면 IDE가 실행을 중지하고 일반 IPython 명령도 디버그하고 실행할 수 있습니다.

그러나 다른 중단점을 설정하지 않는 한 스텝 인(아직?)이 제대로 작동하지 않는 것 같습니다(즉, 한 줄에서 멈춘 다음 다른 기능으로 스텝 인).

그래도 MATLAB에서 온 것이 제가 찾은 최고의 솔루션인 것 같습니다.

3부터는 Python 3.2를 합니다.interact명령 - 전체 python/ipython 명령 공간에 액세스할 수 있습니다.

새 코드 개발

IPython 내부 디버깅

  1. 주피터 사용/실험 반복 속도를 높이기 위한 IPython 셀 실행
  2. 단계별로 %% 디버그 사용

셀 예:

%%debug
...: for n in range(4):
...:    n>2

기존 코드 디버깅

IPthon 내부 디버깅

  1. 테스트 : " " " " ":pytest ... --pdbcls=IPython.terminal.debugger:TerminalPdb --pdb
  2. 사례 : 테트사외디버중깅서:breakpoint(),python -m ipdb 타기.
  3. 디버거에 있는 동안 필요한 경우 전체 IPython 기능을 위한 IPython.embed()

파이썬에 대한 생각

저는 MATLAB이 잘 하는 많은 것들이 여전히 Python이 가지고 있지 않으며 언어의 거의 모든 것이 생산 속도보다 개발 속도를 선호하기 때문에 정말 그래야 한다는 OP에 동의합니다.언젠가는 사소한 버그 수정 이상으로 CPython에 기여할 것입니다.

https://github.com/ipython/ipython/commit/f042f3fea7560afcb518a1940daa46a72fbcfa68

참고 항목디버깅을 사용하여 IPython에서 명령을 실행할 수 있습니까?

pdb를 통해 Emacs의 IPython-shell 및 중단점 세트 내부에서 실행됩니다.set_http가 작동해야 합니다.

python-mode.el, M-xipython RET 등으로 확인.

,import ipdb; ipdb.set_trace()셀 외부 기능에서 오류가 발생합니다.

용사를 합니다.%pdb또는%debug최종 오류 결과만 볼 수 있습니다.코드가 단계별로 실행되는 것을 볼 수 없습니다.

저는 다음 기술을 사용합니다.

%%writefile temp.py
.....cell code.....

셀 코드를 temp.py 파일에 저장합니다.

그리고 나서.%run -i -d temp.pyPDB에 의해 셀 코드를 실행할 것입니다.

-iIPython의 네임스페이스에서 빈 파일 대신 파일을 실행합니다.

-dPython 디버거인 pdb의 제어 하에 당신의 프로그램을 실행합니다.

언급URL : https://stackoverflow.com/questions/16867347/step-by-step-debugging-with-ipython

반응형