[python] 파이썬 디버깅 팁

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

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

관련



답변

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의 향상된 버전으로 작성되었습니다. 혜택?


답변

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

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

pudb 스크린 샷

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

python -m pudb.run my-script.py


답변

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


답변

벌채 반출

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

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

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

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

편집 : 템플릿의 원래 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


답변

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

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

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

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

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


답변

ipdb는 ppy와 비슷하며 ipython이 훌륭합니다.


답변

print 진술

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