Python 자체 디버거 (PDB) 내에서 여러 줄 명령문을 실행하는 방법


157

그래서 나는 파이썬 스크립트를 실행하고 있는데 파이썬 스크립트를 PDB라고 부릅니다.

import ipdb; ipdb.set_trace()

(iPython의 PDB 버전은 차이가 없다고 생각하지만 컬러 출력에만 사용합니다).

이제 디버거에 도착하면 if 절이나 for 루프와 같은 여러 줄 문을 실행하려고하지만 입력하자마자

if condition:

리턴 키를 누르면 오류 메시지가 나타납니다. *** SyntaxError: invalid syntax (<stdin>, line 1)

PDB 내에서 여러 줄로 된 문장을 어떻게 실행할 수 있습니까? 가능하지 않은 경우 if 절이나 for 루프를 계속 실행하는 방법이 있습니까?

답변:


265

pdb에서 사용 가능한 모든 로컬 변수를 사용하여 임시 대화식 Python 세션을 시작하는 동안이 작업을 수행 할 수 있습니다.

(pdb) !import code; code.interact(local=vars())
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 

완료되면 Ctrl-D를 사용하여 일반 pdb 프롬프트로 돌아갑니다.

Ctrl-C를 누르지 않으면 전체 pdb 세션이 종료됩니다.


46
pdb interact명령을 사용하여 동일한 결과를 얻을 수있는 것 같습니다 ( 이 버그 추적기 메시지에서 배운 것처럼 ).
gerrit

3
성명서에 !필요한 이유는 무엇 import입니까?
Indradhanush Gupta

19
아마도 필요하지는 않지만 !사고를 피하기 위해 pdb의 모든 Python 문 앞에 접두사를 두는 습관이 있습니다. 예 c = 42를 들어 pdb 에서 variable에 할당하는 대신 계속 실행합니다 c.
Marius Gedminas

8
@MariusGedminas PDB에서 가장 실망스러운 일! 그들의 명령에 접두사를 붙이면 좋을 것입니다 ...
Ian Clark

참고 : Ctrl-D interact도 종료하는 올바른 방법 인 것처럼 보이지만 Spyder와 잘 어울리지 않습니다.
Josiah Yoder

69

python3 ipdb(및 pdb)에는 interact 이라는 명령이 있습니다. 다음과 같은 용도로 사용할 수 있습니다.

글로벌 네임 스페이스에 현재 범위에서 찾은 모든 (글로벌 및 로컬) 이름이 포함 된 대화식 인터프리터 ( 코드 모듈 사용)를 시작하십시오 .

사용하려면 interactpdb 프롬프트에서 간단히 입력하십시오 . 무엇보다도 여러 줄에 걸친 코드를 적용하고 실수로 다른 pdb 명령이 트리거되는 것을 피하는 데 유용합니다.


2
그렇게 할 때 "NameError : name 'interact'is not defined"라는 메시지가 표시됩니다.
Jason

1
@jason 버전 3.2 이상
vaer-k

2
설명합니다. 나는 파이썬 2.7에있었습니다.
Jason

실제로 이것은 상호 작용이 정의 될 수없는 오류를 발생
시켰고

1
나는 피하는 interact것이 너무 강한 제안 이라고 생각합니다 . 90 %이 내가 필요로하는 모든이며,보다 입력 훨씬 쉽게from IPython import embed; embed()
VAER-K

43

내 권장 사항은 IPython 포함을 사용하는 것입니다.

ipdb> from IPython import embed; embed()

2
목록 이해에서 값이 정의되지 않은 오류가있는 경우 IPython에서 사용하십시오 import embed; embed(user_ns=locals()).
fx-kirin

1
이것은 받아 들인 대답보다 훨씬 나에게 효과적입니다. 예를 들어-몇 줄을 백업하고 무언가를 수정하는 것과 같이 여러 줄을 올바르게 편집 할 수 있으므로 전체 여러 줄 표현을 다시 작성할 필요가 없습니다. 나는 로컬을 @ fx-kirin으로 전달합니다. 제안했다.
ZeDuS

33

Python (2.7.1) 인터프리터 또는 디버거 (import pdb) 내에서 다음 구문으로 여러 줄 명령문을 실행할 수 있습니다.

for i in range(5): print("Hello"); print("World"); print(i)

참고 : 인터프리터 안에있을 때 코드가 실행되기 전에 return을 두 번 눌러야합니다. 그러나 디버거 내에서는 return을 한 번만 누르면됩니다.


5
한 레벨보다 더 깊은 것을 실행하는 것은 허용하지 않습니다.
Antony Hatchkins

7

중단 점에 도달 할 때 몇 개의 명령을 실행하려는 경우 특별한 경우가 있습니다. 그런 다음 디버거 명령이 commands있습니다. 여러 줄의 명령을 입력 한 다음 end키워드로 전체 시퀀스를 끝낼 수 있습니다. 로 더 (pdb) help commands.


2

나는 당신이 이것을 할 수 있는지 모르겠다. 그러나 그것은 ipdb에 대한 훌륭한 기능 일 것이다. 물론 목록 이해를 사용하고 다음과 같은 간단한 여러 줄 표현을 실행할 수 있습니다.

if y == 3: print y; print y; print y;

또한 일반적으로 여러 줄이 필요한 작업을 수행하기 위해 일부 함수를 미리 작성할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.