[python] 문제를 디버깅하기 위해 Python 코드를 단계별로 실행하는 방법은 무엇입니까?

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 pdbset_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()

보다 내부적으로 들어가기위한 단계별 디버깅

  1. 다음 문장을 실행하십시오… “n” (다음)

  2. ENTER를 사용 하여 마지막 디버깅 명령 반복

  3. “q”로 모든 것을 끝내는 중 (quit)

  4. “p”를 사용하여 변수 값 인쇄 (인쇄)

    a) 아빠

  5. “c”를 사용하여 (Pdb) 프롬프트 끄기 (계속)

  6. 당신이있는 곳으로 …보고 “L” (목록)

  7. “s”를 사용하여 서브 루틴으로 스테핑 (step into)

  8. 계속… 그러나 현재 서브 루틴의 끝까지… “r” (return)

  9. 새로운 가치를 부여하십시오

    a) ! b = “B”

  10. 중단 점 설정

    a) 줄 번호

    b) 기능 명을 깰

    c) 파일 이름을 바꿉니다 : linenumber

  11. 임시 중단 점

    a) 줄 번호

  12. 조건부 중단 점

    a) 줄 번호, 조건

참고 : **이 모든 명령은 ** pdb에서 실행해야합니다.

자세한 지식은 다음을 참조하십시오.

https://pymotw.com/2/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의 심각한 누락 기능 :

ipdb 특정 성가심 :

우분투 16.04, ipdb == 0.11, Python 3.5.2에서 테스트되었습니다.


답변

breakpoint()요즘에는 방법 이 존재 합니다.import pdb; pdb.set_trace() .

또한 가능한 환경 변수와 같은 몇 가지 새로운 기능 이 있습니다 .


답변

Java / C # 배경에서 온다면 Pydev 와 함께 Eclipse 를 사용하는 것이 가장 좋습니다 . 이것은 디버거가 내장 된 완전한 기능의 IDE를 제공합니다. django와 함께 사용합니다.