Python 디버깅: `print` 함수 가로채기
디버깅
디버깅은 프로그래머의 숙명이다.
사람들은 프로그래머가 하는 일의 80%가 디버깅이라고도 한다.
Python과 디버깅
파이썬을 쓰면서 불편한 점의 하나는 디버깅이다. 특히 실행하는데 시간이 많이 걸리는 프로그램의 경우는 실행 과정을 계속 앉아서 모니터링하기 힘들기 때문에 여러 가지 수단을 마련해야 한다. 한가지 방법은 출력을 화일로 저장하는 것이다. 하지만 어떻게?
몇 가지 가능성
- Redirect stout to a file in Python
- 유닉스를 쓴다면, 유닉스 차원에서 모든 출력과 에러 메시지를 화일로 보낸다.
python3 -u foo.py 2>&1 | tee log.txt
- Python logging module를 사용한다.
위의 방법들을 시도해 본 결과, 모두 그다지 만족스럽지 못했다.
- 표준출력
stout
을 화일로 보내는 것은 생각보다 잘 되지 않았다. python3 -u foo.py 2>&1 | tee filename.txt
의 경우는 가장 간단하게 쓸 수 있는 방법이지만, 실행 시간이 길어지면filename.txt
가 용량이 지나치게 커지는 문제가 생긴다.logging
은 좋은 방법이지만, 기존의 소스를 고쳐야 한다는 문제가 있다. 그리고logging
을 사용하는 방법을 배워야 한다!
newprint.py
그래서 기존의 print
를 그대로 쓸 수 있는 방법을 고안하게 되었다. 다음을 newprint.py
로 저장한 후, print
를 사용하여 디버깅에 필요한 내용을 화면과 화일에 동시에 출력하고자 할 때, 코드의 첫 머리에 import newprint
, from newprint import print
만 삽입하면, print
내용이 log_년-월-일.py
로 저장된다.
# save the following as newprint.py
from datetime import datetime, date
if not 'print0' in dir():
print0 = print
def print2(*argv, **kwarg):
if 'file' in kwarg:
file=kwarg['file']
# if file is not fDebug:
# print0('strange file is not fDebug!')
# print0(file)
# print0(fDebug)
# print0('strange file is not fDebug!', file=fDebug)
# print0(file, file=fDebug)
# print0(fDebug, file=fDebug)
if 'end' in kwarg:
print0(*argv, end = kwarg['end'])
print0(*argv, end = kwarg['end'], file=fDebug)
else:
print0(*argv, end='\n')
print0(*argv, end='\n', file=fDebug)
print = print2
debug = True
today = date.today()
fnDebug = 'log_'+today.strftime("%Y-%m-%d")+'.txt'
fDebug = open(fnDebug, 'a')
예를 들어 다음과 같이 쓰는 것이다.
import newprint
from newprint import print0, print2, print
from datetime import datetime, date
today = date.today()
print('Current time : ', today)
## Current time : 2020-01-18
log
화일 변경
만약 프로그램이 하루를 넘어 실행되어 log-().txt
의 날짜를 바꿔야 한다면 다음의 루틴으로 가능하다.
today = date.today()
if (today > newprint.today):
newprint.fDebug.close()
newprint.today = today
newprint.fnDebug = 'log_'+today.strftime("%Y-%m-%d")+'.txt'
newprint.fDebug = open(newprint.fnDebug, 'a')
마무리
- 혹시 좀 더 나은 방법이 있다면 댓글로 알려주세요!
wayne
가장 명료하고 깔끔한 정리를 해주셨네요. 바로 적용하기 용이하고 기존 소스 변경도 필요없어서 활용도가 높을것 같습니다.