Emacs에서 RealGUD 사용 (2016 년 5 월 28 일 업데이트)
Emacs 사용자라면 누구나이 스레드 를 사용하여 OP (및 기타)에 설명 된 모든 것을 수행하는 방법을 보여줍니다
- Emacs의 RealGUD 라는 새로운 중요한 디버거 는를 포함하여 모든 디버거와 작동 할 수 있습니다
ipdb
.
- 이맥스 패키지
isend-mode
.
이 두 패키지의 조합은 매우 강력하며 OP에 설명 된 동작을 정확하게 재현하고 더 많은 작업을 수행 할 수 있습니다.
ipdb 용 RealGUD 위키 기사 에 대한 추가 정보 .
원래 답변 :
이 스레드에서 언급 한 모든 것을 포함하여 Python을 디버깅하기위한 많은 다른 방법을 시도한 후에 IPython으로 Python을 디버깅하는 가장 좋은 방법 중 하나는 임베디드 쉘입니다.
사용자 정의 임베디드 IPython 쉘 정의 :
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()
객체 검사 등을 수행 해야하는 위치에 바로 배치 합니다. 예를 들어 my_function
아래 에서 디버깅하고 싶다고 말하십시오.
그것을 사용 :
def my_function(b):
a = b
ipsh() # <- This will embed a full-fledged IPython interpreter
a = 4
그런 my_function(2)
다음 다음 방법 중 하나를 호출 합니다.
- Unix 쉘에서이 함수를 호출하는 Python 프로그램을 실행하여
- 또는 IPython에서 직접 호출하여
호출 방법에 관계없이 인터프리터는라는 줄에서 멈 춥니 다 ipsh()
. 완료되면 할 수 Ctrl-D
있고 파이썬은 변수 업데이트와 함께 실행을 재개합니다. 일반 IPython에서 IPython 셸 (위의 경우 2)에서 코드를 실행하면 새 IPython 셸이 사용자가 호출 한 것 안에 중첩 됩니다. 이는 완벽하지만 괜찮습니다. 어쨌든 통역사가의 위치에서 멈 추면 () ipsh
의 값을 검사하고 정의 된 함수와 객체 등을 볼 수 있습니다.a
2
문제 :
위의 솔루션을 사용하면 코드에서 원하는 곳에서 Python을 중지 한 다음 본격적인 IPython 인터프리터에 빠뜨릴 수 있습니다. 불행히도 스크립트를 호출하면 중단 점을 추가하거나 제거 할 수 없으므로 매우 실망 스럽습니다. 내 생각에 이것은 IPython이 Python을위한 훌륭한 디버깅 도구가되는 것을 방해 하는 유일한 것입니다.
지금 당신이 할 수있는 최선의 방법 :
해결 방법은 ipsh()
Python 인터프리터가 IPython 셸을 시작하려는 다른 위치에 우선 순위를 지정 하는 것입니다 (예 : a breakpoint
). 그런 다음로 미리 정의 된 하드 코딩 된 "브레이크 포인트"사이를 "점프" Ctrl-D
하여 현재 내장 된 IPython 셸을 종료하고 인터프리터가 다음에 호출 할 때마다 다시 중지합니다 ipsh()
.
이 경로를 사용하면 "디버깅 모드"를 종료하고 이후의 모든 중단 점을 무시하는 한 가지 방법은 ipshell.dummy_mode = True
파이썬이 ipshell
위에서 만든 객체 의 후속 인스턴스화를 무시 하도록 하는 것 입니다.
!
중단 점에서 모든 파이썬 명령을 실행하는 명령이 있습니다.