Java / C #에서는 코드를 쉽게 단계별로 실행하여 문제를 추적 할 수 있으며 IDE는이 프로세스를 매우 사용자 친화적으로 만듭니다.
비슷한 방식으로 파이썬 코드를 추적 할 수 있습니까?
답변
예! pdb
그것을하기위한 파이썬 디버거 가 있습니다!
당신은을 통해 파이썬 프로그램을 실행할 수 있습니다 pdb
사용 pdb myscript.py
하거나 python -m pdb myscript.py
.
그런 다음 실행할 수있는 몇 가지 명령이 있으며 pdb
페이지에 설명되어 있습니다.
기억해야 할 유용한 것들은 다음과 같습니다.
b
: 중단 점 설정c
: 중단 점에 도달 할 때까지 계속 디버깅s
: 코드 단계별n
: 다음 코드 줄로 이동l
: 현재 파일의 소스 코드를 나열합니다 (기본값 : 실행중인 행을 포함하여 11 행).u
: 스택 프레임을 탐색d
: 스택 프레임을 탐색p
: 현재 컨텍스트에서 표현식의 값을 인쇄합니다
명령 행 디버거를 사용하지 않으려는 경우 Pydev , Wing IDE 또는 PyCharm 과 같은 일부 IDE 에는 GUI 디버거가 있습니다. Wing과 PyCharm은 상용 제품이지만 Wing은 무료 “Personal”버전을, PyCharm은 무료 커뮤니티 버전을 제공합니다.
답변
Python 대화식 디버거 ‘pdb’사용
첫 번째 단계는 파이썬 인터프리터가 디버깅 모드로 들어가도록하는 것입니다.
A. 명령 줄에서
파이썬 인터프리터의 명령 줄에서 실행하는 가장 직접적인 방법
$ python -m pdb scriptName.py
> .../pdb_script.py(7)<module>()
-> """
(Pdb)
B. 통역사
초기 버전의 모듈을 개발하면서 더 반복적으로 실험합니다.
$ python
Python 2.7 (r27:82508, Jul 3 2010, 21:12:11)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb_script
>>> import pdb
>>> pdb.run('pdb_script.MyObj(5).go()')
> <string>(1)<module>()
(Pdb)
C. 프로그램 내에서
큰 프로젝트와 오래 실행되는 모듈의 경우
다음과 같이 import pdb 및 set_trace ()를 사용하여 프로그램 내부에서 디버깅을 시작할 수 있습니다
.
#!/usr/bin/env python
# encoding: utf-8
#
import pdb
class MyObj(object):
count = 5
def __init__(self):
self.count= 9
def go(self):
for i in range(self.count):
pdb.set_trace()
print i
return
if __name__ == '__main__':
MyObj(5).go()
보다 내부적으로 들어가기위한 단계별 디버깅
-
다음 문장을 실행하십시오… “n” (다음)
-
ENTER를 사용 하여 마지막 디버깅 명령 반복
-
“q”로 모든 것을 끝내는 중 (quit)
-
“p”를 사용하여 변수 값 인쇄 (인쇄)
a) 아빠
-
“c”를 사용하여 (Pdb) 프롬프트 끄기 (계속)
-
당신이있는 곳으로 …보고 “L” (목록)
-
“s”를 사용하여 서브 루틴으로 스테핑 (step into)
-
계속… 그러나 현재 서브 루틴의 끝까지… “r” (return)
-
새로운 가치를 부여하십시오
a) ! b = “B”
-
중단 점 설정
a) 줄 번호
b) 기능 명을 깰
c) 파일 이름을 바꿉니다 : linenumber
-
임시 중단 점
a) 줄 번호
-
조건부 중단 점
a) 줄 번호, 조건
참고 : **이 모든 명령은 ** pdb에서 실행해야합니다.
자세한 지식은 다음을 참조하십시오.
https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/
답변
파이썬에는 ‘pdb’라는 모듈이 있습니다. 파이썬 스크립트 맨 위에서
import pdb
pdb.set_trace()
디버깅 모드로 들어갑니다. ‘s’를 사용하여 ‘gdb’디버거로 수행하는 것과 비슷한 다음 줄을 따라 ‘n’을 사용할 수 있습니다.
답변
Python 3.7부터 breakpoint()
내장 함수를 사용하여 디버거를 시작할 수 있습니다 .
foo()
breakpoint() # drop into the debugger at this point
bar()
기본적으로 breakpoint()
를 가져 와서 pdb
호출 pdb.set_trace()
합니다. 그러나 sys.breakpointhook()
환경 변수 를 통해 사용하거나 환경 변수를 사용 하여 디버깅 동작을 제어 할 수 있습니다 PYTHONBREAKPOINT
.
자세한 내용은 PEP 553 을 참조하십시오.
답변
ipdb (IPython 디버거)
ipdb 는 pdb에 IPython 기능을 추가하여 다음과 같이 크게 개선되었습니다.
- 탭 완성
- 더 많은 맥락 표시
- 구문 강조
pdg와 마찬가지로 ipdb는 여전히 GDB와 비교할 때 완벽하고 완전히 기초적인 것은 아닙니다. 그러나 이미 pdb에 비해 크게 개선되었습니다.
사용법은와 유사 pdb
하므로 다음과 같이 설치하십시오.
python3 -m pip install --user ipdb
그런 다음 디버그를 수행하려는 줄에 추가하십시오.
__import__('ipdb').set_trace(context=21)
Vim snipmate 와 같은 편집기에서 바로 가기를 추가하고 싶을 것입니다.
snippet ipd
__import__('ipdb').set_trace(context=21)
입력 만하면 ipd<tab>
중단 점으로 확장됩니다. dd
모든 것이 한 줄에 들어 있기 때문에 쉽게 제거 할 수 있습니다.
context=21
에 설명 된대로 컨텍스트 라인 수를 증가시킵니다. 디버깅하는 동안 ipdb가 더 많은 컨텍스트 라인을 표시하도록하려면 어떻게해야합니까?
또는 다음과 같이 처음부터 프로그램을 디버그 할 수도 있습니다.
ipdb3 main.py
그러나 일반적으로 다음과 같은 이유로 그렇게하고 싶지 않습니다.
- 파이썬이 그 줄을 읽을 때 모든 함수와 클래스 정의를 거쳐야 할 것입니다.
- ipdb를 해킹하지 않고 컨텍스트 크기를 설정하는 방법을 모르겠습니다. 이를 허용하는 패치 : https://github.com/gotcha/ipdb/pull/155
또는 원시 pdb 3.2+에서와 같이 명령 행에서 몇 가지 중단 점을 설정할 수 있습니다.
ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py
하지만 -c c
어떤 이유로 고장 : https://github.com/gotcha/ipdb/issues/156
python -m module
디버깅이 요청되었습니다 : 명령 줄에서 python -m으로 실행되는 Python 모듈을 디버깅하는 방법은 무엇입니까? 파이썬 3.7은 다음과 같이 할 수 있습니다.
python -m pdb -m my_module
GDB와 비교하여 pdb와 ipdb의 심각한 누락 기능 :
- 여러 세션에서 지속되는 명령 기록 : pdb에 명령 기록 저장
ipdb 특정 성가심 :
- 일부 설정을 해킹하지 않으면 멀티 스레딩이 제대로 작동하지 않습니다 …
우분투 16.04, ipdb == 0.11, Python 3.5.2에서 테스트되었습니다.