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.