파이썬 디버깅을위한 가장 좋은 팁은 무엇입니까?
실제로 할 수있는 일을 말하지 않고 특정 디버거를 나열하지 마십시오.
관련
- 파이썬 코드를 처음으로 실행시키는 좋은 방법은 무엇입니까? -오류 최소화에 대해 설명합니다.
답변
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가 익숙해 보일 수 있습니다.
독립형 스크립트 디버깅에 좋습니다.
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
모듈은 복잡한 구조에 매우 중요합니다