파이썬 디버깅 팁


164

파이썬 디버깅을위한 가장 좋은 팁은 무엇입니까?

실제로 할 수있는 일을 말하지 않고 특정 디버거를 나열하지 마십시오.

관련


답변:


139

PDB

pdb 모듈을 사용하여 pdb.set_trace()어디에서나 삽입 할 수 있으며 중단 점으로 작동합니다.

>>> import pdb
>>> a="a string"
>>> pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb) p a
'a string'
(Pdb)

실행을 계속하려면 c(또는 cont또는 continue)를 사용하십시오.

pdb를 사용하여 임의의 파이썬 표현식을 실행할 수 있습니다. 예를 들어 실수를 발견 한 경우 코드를 수정 한 다음 실행중인 코드에서 동일한 효과를 갖도록 유형 표현식을 입력 할 수 있습니다.

ipdb는 IPython 용 pdb 버전입니다 . 탭 완성을 포함한 모든 IPython 기능과 함께 pdb를 사용할 수 있습니다.

포착되지 않은 예외에서 pdb가 자동으로 실행되도록 설정할 수도 있습니다 .

Pydb 는 Pdb의 향상된 버전으로 작성되었습니다. 혜택?


다음은 pdb 사용에 관한 기사입니다. sontek.net/debugging-python-with-pdb
sontek

개인적으로, 나는 ipdb를 더 좋아합니다.
Sardathrion-남용에 반대

1
분명히라는 pydb의 재 작성 거기 pydbgr은
Ehtesh Choudhury의

: SublimeText 코드를 파이썬 중단 점을 추가 할 수있는 좋은 플러그인이 sublime.wbond.net/packages/Python%20Breakpoints
데니스 Golomazov

웹 애플리케이션을 개발중인 경우 myserver.com/pdb단순히 수행하는 디버그 모드에서 보기를 추가하십시오 import pdb; pdb.set_trace(). 대화식 디버거가있는 Flask / Werkzeug를 사용하는 경우, 그냥 수행하는보기를 가질 수도 있습니다 assert False.
osa

78

전체 화면 콘솔 기반 Python 디버거 인 http://pypi.python.org/pypi/pudb

이 제품의 목표는 최신 GUI 기반 디버거의 모든 장점을보다 가볍고 키보드 친화적 인 패키지로 제공하는 것입니다. PuDB를 사용하면 터미널에서 코드를 작성하고 테스트 할 때 바로 코드를 디버깅 할 수 있습니다. 뛰어난 (현재는 고대의) DOS 기반 Turbo Pascal 또는 C 도구로 작업 한 경우 PuDB의 UI가 익숙해 보일 수 있습니다.

pudb 스크린 샷

독립형 스크립트 디버깅에 좋습니다.

python -m pudb.run my-script.py

설치pip install pudb
congusbongus

40

pdb를 사용하는 경우 바로 가기의 별명을 정의 할 수 있습니다. 나는 이것을 사용한다 :

# Ned's .pdbrc

# Print a dictionary, sorted. %1 is the dict, %2 is the prefix for the names.
alias p_ for k in sorted(%1.keys()): print "%s%-15s= %-80.80s" % ("%2",k,repr(%1[k]))

# Print the instance variables of a thing.
alias pi p_ %1.__dict__ %1.

# Print the instance variables of self.
alias ps pi self

# Print the locals.
alias pl p_ locals() local:

# Next and list, and step and list.
alias nl n;;l
alias sl s;;l

# Short cuts for walking up and down the stack
alias uu u;;u
alias uuu u;;u;;u
alias uuuu u;;u;;u;;u
alias uuuuu u;;u;;u;;u;;u
alias dd d;;d
alias ddd d;;d;;d
alias dddd d;;d;;d;;d
alias ddddd d;;d;;d;;d;;d

이 별명을 어떻게 정의합니까?
Casebash

9
~ / .pdbrc이 물건을 넣어
네드 BATCHELDER

창에 당신은 ~ / _ipython / ipythonrc.ini에 넣을 수 있습니다
fastmultiplication

33

벌채 반출

파이썬에는 이미 훌륭한 내장 로깅 모듈이 있습니다. 여기서 로깅 템플릿 을 사용할 수 있습니다 .

로깅 모듈을 사용하면 중요도 수준을 지정할 수 있습니다. 디버깅 중에는 모든 것을 기록 할 수 있지만 정상 작동 중에는 중요한 것만 기록 할 수 있습니다. 사물을 켜고 끌 수 있습니다.

대부분의 사람들은 기본 인쇄 문을 사용하여 디버그 한 다음 인쇄 문을 제거합니다. 그대로 두는 것이 좋지만 비활성화하십시오. 그런 다음 다른 버그가 있으면 모든 것을 다시 활성화하고 로그를 살펴볼 수 있습니다.

이는 네트워크 연결의 다른 쪽 끝이 시간 초과되어 사라지기 전에 응답해야하는 네트워킹 프로그램과 같이 빠르게 수행해야하는 프로그램을 디버깅하는 가장 좋은 방법입니다. 디버거를 한 단계 씩 수행 할 시간이 충분하지 않을 수 있습니다. 그러나 코드를 실행하고 모든 것을 로그 한 다음 로그를 숨기고 실제로 무슨 일이 일어나고 있는지 알아낼 수 있습니다.

편집 : 템플릿의 원래 URL은 다음과 같습니다. http://aymanh.com/python-debugging-techniques

이 페이지가 없어서 archive.org에 저장된 스냅 샷에 대한 참조로 교체했습니다. http://web.archive.org/web/20120819135307/http://aymanh.com/python-debugging-techniques

다시 사라지면 여기에 언급 한 템플릿이 있습니다. 이것은 블로그에서 가져온 코드입니다. 나는 그것을 쓰지 않았다.

import logging
import optparse

LOGGING_LEVELS = {'critical': logging.CRITICAL,
                  'error': logging.ERROR,
                  'warning': logging.WARNING,
                  'info': logging.INFO,
                  'debug': logging.DEBUG}

def main():
  parser = optparse.OptionParser()
  parser.add_option('-l', '--logging-level', help='Logging level')
  parser.add_option('-f', '--logging-file', help='Logging file name')
  (options, args) = parser.parse_args()
  logging_level = LOGGING_LEVELS.get(options.logging_level, logging.NOTSET)
  logging.basicConfig(level=logging_level, filename=options.logging_file,
                      format='%(asctime)s %(levelname)s: %(message)s',
                      datefmt='%Y-%m-%d %H:%M:%S')

  # Your program goes here.
  # You can access command-line arguments using the args variable.

if __name__ == '__main__':
  main()

그리고 위의 사용법에 대한 그의 설명이 있습니다. 다시, 나는 이것에 대한 크레딧을 얻지 못합니다.


기본적으로 로깅 모듈은 위험, 오류 및 경고 메시지를 인쇄합니다. 모든 레벨이 인쇄되도록이를 변경하려면 다음을 사용하십시오.

$ ./your-program.py --logging=debug

debug.log라는 파일로 로그 메시지를 보내려면 다음을 사용하십시오.

$ ./your-program.py --logging-level=debug --logging-file=debug.log


1
로깅 모듈의 문제점은 유니 코드로 크게 중단되며 국제화 된 응용 프로그램 내에서 작동하려면 다양한 해결 방법이 필요하다는 것입니다. 그럼에도 불구하고 이것은 여전히 ​​파이썬을위한 최고의 로깅 솔루션입니다.
Jacek Konieczny 2012

"logging template here"링크가 종료되었습니다. 업데이트하십시오.
Yohann

20

파이썬 라인이 실행되는 것을 인쇄 할 수 있습니다 (Geo! 덕분에). 예를 들어 특정 함수가 호출되는시기를 확인하거나 ##과 같은 것을 추가하여 특정 행만 추적하도록 수정하는 등의 응용 프로그램에는 여러 가지가 있습니다.

code.interact는 대화식 콘솔로 이동합니다

import code; code.interact(local=locals())

콘솔 히스토리에 쉽게 액세스하려면 " 쉘과 같은 히스토리 메커니즘을 사용할 수 있습니까? "를 참조하십시오.

인터프리터에 대해 자동 완성 기능을 사용할 수 있습니다 .



17

print 진술

  • 어떤 사람들 debug_print은 쉽게 비활성화하기 위해 인쇄 대신 기능을 권장합니다
  • pprint모듈은 복잡한 구조에 매우 중요합니다

3
모든 디버거가 실패 +1, 인쇄, 그래 debug_print 좋은 보탬이 될 것입니다 당신의 친구입니다
아 누락 Uniyal

특정 섹션을 추적하여 해결할 수 있다는 것을 제외하고는 일반적으로 첫 번째로 인쇄 한 다음 두 번째로 디버그 합니다.
Casebash

4
실제로 로그 모듈은 그렇게합니다.
전자 좌석

사실이지만 로깅을 설정해야합니다. 나는 명예 후에 모듈을 사용하는 방법을 배울 것이다
Casebash

인쇄는 간단한 경우, 특히 시작 시간이 짧은 프로젝트를 개발할 때 유용 할 수 있습니다. 다른 한편으로 그것은 중독성이 있고 더 복잡한 시나리오에서 pdb 나 다른 디버거를 통해 그것을 사용하면 보통 두통을 일으킬 것입니다
vinilios

16

스크립트를 디버깅하는 확실한 방법

python -m pdb script.py
  • 해당 스크립트에서 예외가 발생할 때 유용
  • virtualenv를 사용하고 pdb 명령이 venvs python 버전에서 실행되고 있지 않을 때 유용합니다.

해당 스크립트의 정확한 위치를 모르는 경우

python -m pdb ``which <python-script-name>``

15

파이 데브

PyDev 에는 꽤 좋은 대화식 디버거가 있습니다. 시계 식, 호버 투 평가, 스레드 및 스택 목록 및 현대적인 시각적 디버거에서 기대할 수있는 거의 모든 편의 시설이 있습니다. 실행중인 프로세스에 연결하고 원격 디버깅을 수행 할 수도 있습니다.

그러나 다른 시각적 디버거와 마찬가지로 다른 문제를 모두 시도한 후 간단한 문제 또는 매우 복잡한 문제에 유용합니다. 나는 여전히 로깅을 사용하여 대부분의 무거운 작업을 수행합니다.


편집하고 계속할 수 있습니까?
Casebash

@CaseBash 아니오 그렇지 않지만 그 기능은 계획되어 있습니다. 그럼에도 불구하고 중단 점을 설정 / 설정 해제하고 변수 값을 살펴 보는 속도와 용이성은 여전히 ​​매우 유용합니다.
Jiaaro


12

Winpdb 는 매우 훌륭하며 이름과 달리 완전히 크로스 플랫폼입니다.

매우 멋진 프롬프트 기반 GUI 디버거가 있으며 원격 디버깅을 지원합니다.


@Casebash-자세한 내용 추가
orip

1
+1 이것은 멀티 스레딩을 처리 할 수있는 유일한 파이썬 디버거입니다.
Lee Netherton

멀티 스레딩의 "처리"에주의하십시오. 스레드에서 예외가 발생하면 전체 프로세스가 정지됩니다. 당신이 그것을 알고 있다면 나쁘지 않은, 당신이하지 않으면 매우 고통
월트 W

이 프로젝트는 2014 년 4 월 현재 죽었다
Alojz 야 네즈에게

7

Vim에는 다음 세 가지 바인딩이 있습니다.

map <F9> Oimport rpdb2; rpdb2.start_embedded_debugger("asdf") #BREAK<esc>
map <F8> Ofrom nose.tools import set_trace; set_trace() #BREAK<esc>
map <F7> Oimport traceback, sys; traceback.print_exception(*sys.exc_info()) #TRACEBACK<esc>

rpdb2Remote Python Debugger는 견고한 그래픽 디버거 인 WinPDB와 함께 사용할 수 있습니다. 나는 당신이 요청할 것이라는 것을 알고 있기 때문에 그래픽 디버거가 기대하는 모든 것을 할 수 있습니다 :)

내가 사용 pdb에서 nose.tools내가 단위 테스트뿐만 아니라 일반 코드를 디버깅 할 수 있도록.

마지막으로 F7 매핑은 예외가 스택의 상단으로 버블 링 될 때 얻을 수있는 것과 유사한 트레이스 백을 인쇄합니다. 나는 그것이 몇 번 이상 실제로 유용하다는 것을 알았습니다.


4

클래스에 유용한 repr () 메소드를 정의하고 (그래서 객체가 무엇인지 알 수 있음) repr () 또는 "% r"% (...) 또는 "... {0! r} ...". format 디버그 메시지 / 로그의 (...)는 효율적인 디버깅의 핵심입니다.

또한 다른 답변에서 언급 한 디버거는 repr () 메서드를 사용합니다.


2

실행중인 Python 애플리케이션에서 스택 추적 가져 오기

여기 몇 가지 트릭이 있습니다 . 이들은 포함합니다

  • 신호를 보내 인터프리터에 침입 / 스택 추적 인쇄
  • 준비되지 않은 Python 프로세스에서 스택 추적 가져 오기
  • 디버깅에 유용한 플래그로 인터프리터 실행

2

디버거에서 시간을 보내고 싶지 않고 pdb명령 줄 인터페이스의 유용성이 좋지 않은 경우 실행 추적을 덤프 하고 나중에 분석 할 수 있습니다 . 예를 들면 다음과 같습니다.

python -m trace -t setup.py install > execution.log

그러면 모든 소스 setup.py install실행 라인이에 덤프 됩니다 execution.log.

추적 출력을 사용자 정의하고 자신 만의 추적 프로그램을 작성하기 쉽도록 xtrace 모듈 (공용 도메인) 에 코드 조각을 모았습니다 .


1

가능하면 M-x pdb소스 수준 디버깅을 위해 emacs를 사용하여 디버깅합니다.


1

Andreas Zeller의 Udacity에있는 " Software Debugging " 이라는 전체 온라인 과정이 있으며 디버깅 에 대한 팁을 제공합니다.

코스 요약

이 클래스에서는 프로그램을 체계적으로 디버깅하는 방법, 디버깅 프로세스를 자동화하는 방법 및 Python에서 여러 자동화 된 디버깅 도구를 작성하는 방법을 학습합니다.

왜이 과정을 수강합니까?

이 과정을 마치면 체계적인 디버깅에 대해 제대로 이해하고 디버깅을 자동화하는 방법을 알고 Python에서 여러 기능 디버깅 도구를 구축하게됩니다.

전제 조건 및 요구 사항

Udacity CS101 이상의 수준에서 프로그래밍 및 Python에 대한 기본 지식이 필요합니다. 객체 지향 프로그래밍에 대한 기본적인 이해가 도움이됩니다.

추천.


0

호출 스택을 읽기 쉬운 방식으로 인쇄하는 멋진 그래픽 방법을 원한다면 다음 유틸리티를 확인하십시오. https://github.com/joerick/pyinstrument

명령 행에서 실행하십시오.

python -m pyinstrument myscript.py [args...]

모듈로 실행하십시오.

from pyinstrument import Profiler

profiler = Profiler()
profiler.start()

# code you want to profile

profiler.stop()
print(profiler.output_text(unicode=True, color=True))

장고와 함께 실행 :

그냥 추가 pyinstrument.middleware.ProfilerMiddleware하는 MIDDLEWARE_CLASSES후 추가 ?profile프로파일을 활성화 요청 URL의 끝에.

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