XX
在解决BabyGan的环境问题后,终于到生成与判定阶段。由于用的是tensorflow-gpu-1.x
,出现一大堆WARNING
后就退出了,哥们儿连ERROR
都懒得报就退出了,真的会谢。所以想debug一下看看代码在哪儿退出的。
在c语言中 __FILE__
,__LINE__
,__FUNC__
这三个变量,用得好可以当作一个动态调试器,帮助定位一些运行时错误,不管是调试还是运行日志的打印跟踪都非常有用。但是在python中,却没有提供这样的错误,报错都是使用的默认的报错堆栈来跟踪错误,对日志格式输出不够友好。
方法
inspect
inspect
是python堆栈管理的包,可以实现了 __FILE__
,__LINE__
,__FUNC__
这三个命令:
import inspect
def __LINE__():
stack_t = inspect.stack()
ttt = inspect.getframeinfo(stack_t[1][0])
return ttt.lineno
def __FUNC__():
stack_t = inspect.stack()
ttt = inspect.getframeinfo(stack_t[1][0])
return ttt.function
def __FILE__():
stack_t = inspect.stack()
ttt = inspect.getframeinfo(stack_t[1][0])
return ttt.filename
logging
logging
模块是python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等。
日志等级
DEBUG
:程序调试bug时使用;INFO
:程序正常运行时使用;WARNING
:程序未按预期运行时使用,但并不是错误,如手机号已被注册;ERROR
:程序出错误时使用,如:IO操作失败;CRITICAL
:特别严重的问题,导致程序不能再继续运行时使用,如服务器宕机、磁盘爆满。
默认的是WARNING
等级,当在WARNING
或WARNING
之上等级的才记录日志信息,即在WARNING
及之上(WARNING
/ERROR
/CRITICAL
)等级的才会被记录。
日志显示数据格式
%(levelno)s
:打印日志级别的数值%(levelname)s
:打印日志级别的名称%(pathname)s
:打印当前执行程序的路径,其实就是sys.argv[0]%(filename)s
:打印当前执行程序名%(funcName)s
:打印日志的当前函数%(lineno)d
:打印日志的当前行号%(asctime)s
:打印日志的时间%(thread)d
:打印线程ID%(threadName)s
:打印线程名称%(process)d
:打印进程ID%(message)s
:打印日志信息
根据上述信息可以定义自己的log输出形式
import logging
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: (message)s')
logging.debug('这是⼀个debug级别的⽇志信息')
logging.info('这是⼀个info级别的⽇志信息')
logging.warning('这是⼀个warning级别的⽇志信息')
logging.error('这是⼀个error级别的⽇志信息')
logging.critical('这是⼀个critical级别的⽇志信息')