我认为在运行 Python 脚本时,使用日志记录是打印调试信息的最佳解决方案。我编写了一个 DebugPrint 模块,帮助更轻松地使用日志记录:
import logging
import os
import time
DEBUGMODE=True
logging.basicConfig(level=logging.DEBUG)
log=logging.getLogger('=>')
def DbgPrint(*args, **kwargs):
if DEBUGMODE:
import inspect
className = None
try:
className = inspect.stack()[2][0].f_locals['self'].__class__.__name__
except:
pass
modName=None
try:
modName = os.path.basename(inspect.stack()[2][1])
except:
pass
lineNo=inspect.stack()[2][2]
fnName=None
try:
fnName = inspect.stack()[2][3]
except:
pass
DbgText="line#{}:{}->{}->{}()".format(lineNo, modName,className, fnName)
argCnt=len(args)
kwargCnt=len(kwargs)
fmt=""
fmt1=DbgText+":"+time.strftime("%H:%M:%S")+"->"
if argCnt > 0:
fmt1+=(argCnt-1)*"%s,"
fmt1+="%s"
fmt+=fmt1
if kwargCnt>0:
fmt2="%s"
args+=("{}".format(kwargs),)
if len(fmt)>0:
fmt+=","+fmt2
else:
fmt+=fmt2
log.debug(fmt,*args)
if __name__=="__main__":
def myTest():
print("Running myTest()")
DbgPrint("Hello","World")
myTest()
如果DEBUGMODE变量为false,则不会打印任何内容。
如果为true,则上面的示例代码将打印出:
DEBUG:=>:16:24:14:line
现在我将使用一个定义类的模块来测试DebugPrint。
from DebugPrint import DbgPrint
class myTestClass(object):
def __init__(self):
DbgPrint("Initializing the class")
def doSomething(self, arg):
DbgPrint("I'm doing something with {}".format(arg))
if __name__=='__main__':
test=myTestClass()
test.doSomething("a friend!")
当运行此脚本时,输出如下:
DEBUG:=>:16:25:02:line
DEBUG:=>:16:25:02:line
请注意,控制台打印的模块名称、类名、函数名称和行号以及语句打印时间是正确的。希望您会发现这个实用程序很有用。
logging
模块? - Haifeng Zhanglogging
是正确答案),但您始终可以使用动态定义的函数。只需在函数内部执行以下操作:debugprint = print if debug else lambda *a, **k: None
,然后在整个函数中使用debugprint
来代替print
进行调试打印;这样做会评估参数并产生函数调用开销,但在非调试模式下不会执行任何操作,在调试模式下则会打印输出。 - ShadowRanger