PDB 중단 점을 Python 코드에 넣는 더 간단한 방법?


105

편의 질문입니다. 저는 Visual Studio 및 XCode와 같은 IDE의 디버거로 인해 약간 망쳐졌습니다. import pdb; pdb.set_trace()중단 점을 설정 하기 위해 입력해야하는 것이 약간 어색하다는 것을 알았습니다 (파일 상단에 pdb를 가져 오지 않고 잊어 버릴 수도 있습니다).

IDE에서 보는 것만 큼 간단하고 눈에 띄지 않는 Python 코드에서 중단 점을 설정하는 더 간단한 방법이 있습니까?


PyCharm을 사용하십시오. Python IDE를 사용하여 실행하는 것을 제외하고 중단 점 줄을 입력하는 것보다 더 간단 할 수있는 방법은 무엇입니까?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

python -m pdb <your_script>.py 그런 다음 b <line_number>선택한 줄 번호 (함수 괄호 없음)에서 중단 점을 설정하기 만하면 됩니다. c중단 점을 계속하려면 누르 십시오. b명령 자체를 사용하여 모든 중단 점을 볼 수 있습니다 . help디버깅하는 동안 사용 가능한 다른 pdb 명령을 보려면 입력 하십시오.
arcseldon

1
Python 3.7부터 이제 내장 breakpoint()함수를 사용할 수 있습니다 . python.org/dev/peps/pep-0553
Daniel

답변:


117

다음을 실행하여 pdb명령 줄에서 프로그램을 실행할 수 있습니다.

python -m pdb your_script.py

첫 번째 줄에서 중단되면 break명령을 사용하여 코드에서 원하는 위치에 중단 점을 추가 할 수 있습니다. 구문은 다음과 같습니다.

b (reak) [[파일 이름 :] lineno | 함수 [, 조건]]

어디에서나 중단 점을 추가 할 수있을만큼 유연합니다.


24
이 점을 명확히하기 위해 pdb.set_trace()디버거로 이동하여 l명령 (목록)을 사용하고 27 행에 중단 점을 설정하려는 경우 다음을 입력합니다. 그러면 b 27디버거가 27 행에 중단 점을 설정합니다. 문서는 이해하기가 약간 어려웠으므로 설명의 요점을 추가하고 싶었습니다).
benjaminmgross

9
또한 객체 x가 있고 해당 메서드 f가 호출 될 때 중지 하려면 break x.f, 다음 이라고 말할 수 있습니다 c(ontinue). 이는 객체가 액세스 할 수없는 파일에 있거나 예를 들어 피클 링을 통해 동적으로 생성 된 경우에도 작동합니다.
osa

2
스택 트레이스 후에 디버깅 할 때 모듈에 대한 전체 경로를 복사하고 다음과 같은 줄 번호를 추가 할 수 있습니다.b /data/users/me/project/env/local/lib/python2.7/site-packages/django/core/urlresolvers.py:596
유효한

58

당신이 사용할 수있는:

from pdb import set_trace as bp

code
code
bp()
code
code

왜 superflous 앨리어싱이되는지 확실하지 않지만 ;-). 어떤 이유로 내 IDE / Editor (vscode)는 이번 오전에 암말이었고 계속 밑줄을 긋습니다. 귀하의 의견을 보는 것이 정말 도움이되었습니다. 좋은 하루 보내세요!
MrMesees

정말 고맙습니다!
계류

set_tracebp ()를 사용할 때만 강제로 가져 오려면 어떻게 해야합니까?
alper

39

vim에는 이에 대한 매크로가 설정되어 있습니다 (내 .vimrc 파일에 있음).

map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

따라서 \ b (삽입 모드가 아닐 때)를 누르면 현재 줄 뒤에 중단 점을 추가하거나 \ B (대문자 참고)를 누르면 현재 줄 앞에 하나가 추가됩니다.

잘 작동하는 것 같습니다. 대부분의 다른 '간단한'프로그래머 편집기 (emacs, sublimetext 등)는이 작업을 수행하는 유사한 쉬운 방법을 가지고 있어야합니다.

편집 : 나는 실제로있다 :

au FileType python map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
au FileType python map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

파이썬 소스 파일에 대해서만 켜집니다. 자바 스크립트 또는 사용하는 다른 언어에 대해 유사한 줄을 매우 쉽게 추가 할 수 있습니다.

2019 업데이트 (Python 3.7 이상)

Python 3.7+에는 이제 vim breakpoint()에서 이전 버전 import pdb; pdb.set_trace()을 대체 할 수 있는 내장 기능 이 있습니다 . 여전히 동일하게 작동합니다.


2
좋은 솔루션이며 .vimrc 파일에 set autoindent있는 경우 추가 된 행도 올바른 들여 쓰기를 갖 습니다 .
Jealie 2014

예, 대부분의 배포판이 표준으로 제공되지 않는 이유를 이해할 수 없습니다 set autoindent. 나는 새로운 시스템과 함께 할 첫 번째 것들 중 하나는 ... 더 나은의 vimrc에서 풀입니다
다니엘

1
register라는 이름의 vim을 사용하십시오! 'd'( d ebug 에서와 같이)를 버퍼링하려는 줄을 저장 "dyy하고 필요할 때마다 "dp또는 "dP. vim 레지스터 알아보기 ! 그들은 매우 유용하며 항상 지원됩니다!
polvoazul 2014

그 후에 : w를 추가하는 방법?
ji-ruh

명명 된 레지스터 개념을 조금 더 살펴보면 매크로를 기록하고 필요한 작업을 수행 한 다음 매크로를 중지 할 수 있습니다. 그런 다음 매크로 내용을 vimrc 파일에 붙여 넣습니다. 예를 들어로 매크로를 qd시작한 다음 나중에 "dp붙여 넣습니다. 마지막으로 레지스터에 지침을 할당하여 항상 vim로드 업에 채워집니다. 예 : let @d = 'oimport pdb; pdb.set_trace()k0:w' 이제 @d줄을 파일에 붙여넣고 싶을 때마다 사용 하십시오. 위의 내용도 파일을 저장합니다. 그러나 이스케이프 등의 특수 문자가 관련되어 있으므로 (위의 복사 / 붙여 넣기 대신) 직접 기록해야합니다.
arcseldon

27

프로그램을 실행할 때마다 중단 점을 수동으로 설정하지 않으려면 (Python 3.2 이상에서), 예를 들어 3 행에 중단 점을 직접 만들고 실행을 중지한다고 가정합니다.

python -m pdb -c "b 3" -c c your_script.py

다음 정보가 도움이 될 수 있습니다.

.pdbrc 파일이 사용자의 홈 디렉터리 나 현재 디렉터리에 있으면 디버거 프롬프트에서 입력 한 것처럼 읽어서 실행합니다. 이것은 별칭에 특히 유용합니다. 두 파일이 모두 존재하는 경우 홈 디렉토리에있는 파일을 먼저 읽고 거기에 정의 된 별칭을 로컬 파일로 대체 할 수 있습니다.

버전 3.2에서 변경 : .pdbrc는 이제 continue 또는 next와 같은 디버깅을 계속하는 명령을 포함 할 수 있습니다. 이전에는 이러한 명령이 효과가 없었습니다.

버전 3.2의 새로운 기능 : pdb.py는 이제 .pdbrc 파일에 제공된 것처럼 명령을 실행하는 -c 옵션을 허용합니다. 디버거 명령을 참조하십시오.



10

다음은 소스 코드에서 아무것도 구현하지 않고 명령 줄에서 pdb를 사용하는 방법입니다 (문서 및 기타 온라인 리소스는 과거에 시각적 디버거 만 사용했던 프로그래머에게이를 설명하는 좋은 작업을 수행하지 않습니다).

쉘 프롬프트에 다음을 입력하여 pdb를 시작하십시오.

python -m pdb 'python_script'

이 명령은 pdb를 초기화하고 pdb 디버거는 python_script의 첫 번째 줄에서 중단되고 사용자의 입력을 기다립니다.

(Pdb)

디버거와 통신하기위한 인터페이스입니다. 이제 여기에서 명령을 지정할 수 있습니다. 비주얼 디버거에서 버튼이나 키보드 단축키를 사용하는 것과 달리 여기서는 명령을 사용하여 동일한 결과를 도출합니다.

"n"(다음) 명령으로 코드의 다음 줄로 이동할 수 있습니다.

(Pdb) n

다음을 수행하면 줄 번호와 소스의 특정 코드가 표시됩니다.

> python_script(line number)method name
-> current line in the source code

소스 코드에 줄 번호를 지정하여 중단 점을 설정할 수 있습니다.

(Pdb) b 50

여기서 디버거는 50 번째 줄에서 중단되도록 설정되어 있습니다. 다른 중단 점이 없으면 50 번째 줄의 중단 점이 첫 번째가되고이 경우 1 인 중단 점 ID로 참조 될 수 있습니다. 중단 점을 더 추가하면 순차적으로 식별자 (예 : 2, 3 등)를 얻습니다.

중단 점이 설정되면 pdb가 다음과 같이 중단 점에 도달 할 때까지 프로그램을 계속 실행합니다.

(Pdb) c

중단 점에 도달하면 이전에 설명한대로 n 명령을 사용하여 다음 줄로 이동할 수 있습니다. 변수 값을 확인하려면 다음과 같이 매개 변수 명령을 실행합니다.

(Pdb) p variable_name

중단 점이 더 이상 필요하지 않으면 clear 명령을 사용하여 중단 점의 ID를 전달하여 지울 수 있습니다.

(Pdb) clear 1

마지막으로 디버거 작업을 마치면 파이썬 명령 줄 인터프리터를 종료하는 것처럼 실행을 종료 할 수 있습니다.

(Pdb) exit()

이것이 누구나 pdb를 시작하는 데 도움이되기를 바랍니다. 다음은 디버거에서 사용할 수있는 명령 목록입니다. pdb so question and answers



4

파이썬 디버깅을 지원하는 IDE를 사용하거나 훌륭한 Winpdb 도구를 확인할 수 있습니다. 모든 플랫폼에서 작동하며 Python 스크립트에 그래픽 디버깅 기능을 제공합니다.

http://winpdb.org/


2

당신이 사용할 수있는:

  • 날개 ide
  • pydev 플러그인으로 이클립스
  • pycharms

위의 모든 항목은 IDE 내부에서 Python 디버깅을 지원합니다.


0

Python 플러그인이 설치된 경우 Atom에서 ' pdb'를 입력하고 Enter 키를 누르면 스 니펫이 가져 오기를 입력하고 다시 추적합니다.

나는 지금 이것을 사용했는데, vim에서 편집하고 드롭 다운이 나타날 때까지 기다리는 경우에도 가끔 입력하기 만하면됩니다.


0

과소 평가 된 방법은 pdb에서 직접 중단 점을 설정하는 것입니다.

pdb> b torch/__init__:10

중단 점을 설정합니다. site-packages\torch\__init__.py:10

그런 다음 pdb> c이 중단 점에서 중지합니다.

다음도 유효합니다.

pdb> b d:\anaconda\lib\site-packages\torch\__init__.py:10
pdb> b torch\__init__.py:10
pdb> b d:\\anaconda\\lib\\site-packages\\torch\\__init__.py:10
pdb> b d:/anaconda/lib/site-packages/torch/__init__.py:10

자세한 내용은 문서 를 참조하십시오 .


0

Python-Mode 플러그인 과 함께 Vim을 사용 하거나 Elpy 플러그인 과 함께 Emacs를 사용할 수 있습니다.

이 플러그인은 간단한 키 입력 ( \ bVim 및 C-c C-u bEmacs)과 함께 경량 형 IDE (코드 폴딩, 리팩토링, 린팅 등)의 기타 여러 기능을 통해 중단 점을 제공합니다 . 모두 경량 터미널 기반 텍스트 편집기 내에서 가능합니다.


-1

스크립트에서 디버거를 실행하는 가장 간단한 방법은

pdb your_script.py

Linux 명령 줄에서 pdb를 실행하면

usage: pdb.py scriptfile [arg] ...

설치하는 방법 pdb? 아니면 어디서?
kenorb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.