- 작성시간 : 2017/01/27 13:22
- 퍼머링크 : mcchae.egloos.com/11249290
- 덧글수 : 2
파이썬을 주 언어로 사용한지 십년이 다 되어 가는데도 아직도 제대로 모르고 있는
부분이 많다는 생각입니다. 그것도 표준 라이브러리를 말이지요.
암튼 간단히 다음의 프로그램을 봅니다.
(PyMOTW 의 cgitb 내용을 참조했습니다.)
def func1(arg1):
local_var = arg1 * 2
return func2(local_var)
def func2(arg2):
local_var = arg2 + 2
return func3(local_var)
def func3(arg3):
local_var = arg2 / 2
return local_var
func1(1)
라는 파이썬 프로그램을 돌리면,
$ python cgitb_basic_traceback.py
Traceback (most recent call last):
File "cgitb_basic_traceback.py", line 22, in <module>
func1(1)
File "cgitb_basic_traceback.py", line 12, in func1
return func2(local_var)
File "cgitb_basic_traceback.py", line 16, in func2
return func3(local_var)
File "cgitb_basic_traceback.py", line 19, in func3
local_var = arg2 / 2
NameError: global name 'arg2' is not defined
위와 같이 오류가 나옵니다.
뭐 이걸로도 충분하다고 생각하실 수가 있지만,
더 자세히 로그만 보고도 판단할 필요가 있는데
그러기 위해서는 뭐 이것 저것 해 줄 것 없이,
import cgitb
cgitb.enable(format='text')
def func1(arg1):
local_var = arg1 * 2
return func2(local_var)
def func2(arg2):
local_var = arg2 + 2
return func3(local_var)
def func3(arg3):
local_var = arg2 / 2
return local_var
func1(1)
위와 같이
import cgitb
cgitb.enable(format='text')
라는 두 줄만 추가해 줍니다.
그러면 그 결과로,
$ python cgitb_extended_traceback.py
<type 'exceptions.NameError'>
Python 2.7.2: /Users/dhellmann/Envs/pymotw/bin/python
Thu Feb 21 06:35:39 2013
A problem occurred in a Python script. Here is the sequence of
function calls leading up to the error, in the order they occurred.
/Users/dhellmann/Documents/PyMOTW/src/PyMOTW/cgitb/cgitb_extended_traceback.py in <module>()
21 def func3(arg3):
22 local_var = arg2 / 2
23 return local_var
24
25 func1(1)
func1 = <function func1>
/Users/dhellmann/Documents/PyMOTW/src/PyMOTW/cgitb/cgitb_extended_traceback.py in func1(arg1=1)
13 def func1(arg1):
14 local_var = arg1 * 2
15 return func2(local_var)
16
17 def func2(arg2):
global func2 = <function func2>
local_var = 2
/Users/dhellmann/Documents/PyMOTW/src/PyMOTW/cgitb/cgitb_extended_traceback.py in func2(arg2=2)
17 def func2(arg2):
18 local_var = arg2 + 2
19 return func3(local_var)
20
21 def func3(arg3):
global func3 = <function func3>
local_var = 4
/Users/dhellmann/Documents/PyMOTW/src/PyMOTW/cgitb/cgitb_extended_traceback.py in func3(arg3=4)
20
21 def func3(arg3):
22 local_var = arg2 / 2
23 return local_var
24
local_var undefined
arg2 undefined
<type 'exceptions.NameError'>: global name 'arg2' is not defined
__class__ = <type 'exceptions.NameError'>
__delattr__ = <method-wrapper '__delattr__' of exceptions.NameError object>
__dict__ = {}
__doc__ = 'Name not found globally.'
__format__ = <built-in method __format__ of exceptions.NameError object>
__getattribute__ = <method-wrapper '__getattribute__' of exceptions.NameError object>
__getitem__ = <method-wrapper '__getitem__' of exceptions.NameError object>
__getslice__ = <method-wrapper '__getslice__' of exceptions.NameError object>
__hash__ = <method-wrapper '__hash__' of exceptions.NameError object>
__init__ = <method-wrapper '__init__' of exceptions.NameError object>
__new__ = <built-in method __new__ of type object>
__reduce__ = <built-in method __reduce__ of exceptions.NameError object>
__reduce_ex__ = <built-in method __reduce_ex__ of exceptions.NameError object>
__repr__ = <method-wrapper '__repr__' of exceptions.NameError object>
__setattr__ = <method-wrapper '__setattr__' of exceptions.NameError object>
__setstate__ = <built-in method __setstate__ of exceptions.NameError object>
__sizeof__ = <built-in method __sizeof__ of exceptions.NameError object>
__str__ = <method-wrapper '__str__' of exceptions.NameError object>
__subclasshook__ = <built-in method __subclasshook__ of type object>
__unicode__ = <built-in method __unicode__ of exceptions.NameError object>
args = ("global name 'arg2' is not defined",)
message = "global name 'arg2' is not defined"
The above is a description of an error in a Python program. Here is
the original traceback:
Traceback (most recent call last):
File "cgitb_extended_traceback.py", line 25, in <module>
func1(1)
File "cgitb_extended_traceback.py", line 15, in func1
return func2(local_var)
File "cgitb_extended_traceback.py", line 19, in func2
return func3(local_var)
File "cgitb_extended_traceback.py", line 22, in func3
local_var = arg2 / 2
NameError: global name 'arg2' is not defined
위와 같이 로그 자체 만으로도 어느정도 파악이 가능할 정도의 자세한 내용을 보여줍니다.
구체적인 내용으로
* 전체 경로를 보여주고
* 스택에서 호출된 함수의 패러미터 값을 각각 보여주고
* 에러가 발생한 부분의 다섯줄 정도씩 보여주고
* 에러를 발생시킨 구문의 변수 값을 보여줍니다.
cgitb 가 cbi라는 이름이 이야기 하듯이
cgi 프로그램 (20년 정도도 더 된 원시시대 이야기 이죠)을 하다가 CGI 트레이스백 결과를
좀더 자세히 보기 위해 만들어진 것인데 표준 라이브러리 이므로 CGI 라는 것 대신
위의 기능으로 활용하면 될 것 같습니다.
(format에 html 로 지정하면 html결과가 나온다는 것으로 보아 cgi 랑 관계된 것이 맞네요 ^^)
어느 분께는 도움이 되셨기를...



덧글