python中使用sys模板和logging模块获取行号和函数名的方法
对于python,这几天一直有两个问题在困扰我:
复制代码 代码如下: %(name)s Name of the logger (logging channel) %(levelno)s Numeric logging level for the message (DEBUG,INFO, WARNING,ERROR,CRITICAL) %(levelname)s Text logging level for the message ("DEBUG","INFO", "WARNING","ERROR","CRITICAL") %(pathname)s Full pathname of the source file where the logging call was issued (if available) %(filename)s Filename portion of pathname %(module)s Module (name portion of filename) %(lineno)d Source line number where the logging call was issued (if available) %(funcName)s Function name %(created)f Time when the LogRecord was created (time.time() return value) %(asctime)s Textual time when the LogRecord was created %(msecs)d Millisecond portion of the creation time %(relativeCreated)d Time in milliseconds when the LogRecord was created, relative to the time the logging module was loaded (typically at application startup time) %(thread)d Thread ID (if available) %(threadName)s Thread name (if available) %(process)d Process ID (if available) %(message)s The result of record.getMessage(),computed just as the record is emitted 也就是说,logging是能够获取到调用者的行号和函数名的,那会不会也可以获取到自己的行号和函数名呢? 复制代码 代码如下: def currentframe(): """Return the frame object for the caller's stack frame.""" try: raise Exception except: return sys.exc_info()[2].tb_frame.f_back def findCaller(self): """ Find the stack frame of the caller so that we can note the source file name,line number and function name. """ f = currentframe() #On some versions of IronPython,currentframe() returns None if #IronPython isn't run with -X:Frames. if f is not None: f = f.f_back rv = "(unknown file)","(unknown function)" while hasattr(f,"f_code"): co = f.f_code filename = os.path.normcase(co.co_filename) if filename == _srcfile: f = f.f_back continue rv = (co.co_filename,f.f_lineno,co.co_name) break return rv def _log(self,level,msg,args,exc_info=None,extra=None): """ Low-level logging routine which creates a LogRecord and then calls all the handlers of this logger to handle the record. """ if _srcfile: #IronPython doesn't track Python frames,so findCaller throws an #exception on some versions of IronPython. We trap it here so that #IronPython can use logging. try: fn,lno,func = self.findCaller() except ValueError: fn,func = "(unknown file)","(unknown function)" else: fn,"(unknown function)" if exc_info: if not isinstance(exc_info,tuple): exc_info = sys.exc_info() record = self.makeRecord(self.name,fn,exc_info,func,extra) self.handle(record) 我简单解释一下,实际上是通过在currentframe函数中抛出一个异常,然后通过向上查找的方式,找到调用的信息。其中 复制代码 代码如下: rv = (co.co_filename,co.co_name) 的三个值分别为文件名,行号,函数名。(可以去http://docs.python.org/library/sys.html来看一下代码中几个系统函数的说明) 复制代码 代码如下: #!/usr/bin/python # -*- coding: utf-8 -*- ''' #============================================================================= # FileName: xf.py # Description: 获取当前位置的行号和函数名 # Version: 1.0 #============================================================================= ''' import sys def get_cur_info(): """Return the frame object for the caller's stack frame.""" try: raise Exception except: f = sys.exc_info()[2].tb_frame.f_back return (f.f_code.co_name,f.f_lineno) def callfunc(): print get_cur_info() if __name__ == '__main__': callfunc() 输入结果是: 复制代码 代码如下: ('callfunc',24) 符合预期~~ 哈哈,OK!现在应该不用再抱怨取不到行号和函数名了吧~ ============================================================================= 复制代码 代码如下: import sys def get_cur_info(): print sys._getframe().f_code.co_name print sys._getframe().f_back.f_code.co_name get_cur_info() 调用结果是: 复制代码 代码如下: get_cur_info <module> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |