我手中有一个要调试的代码。在运行代码时,它会定期打印training loss : x.xxxx secs
,但在代码中找不到这样的行。我需要知道它的来源。因此,我希望发生的事情是发生的,例如当发生编译错误时,它会追溯到最后一个被调用的函数。是否可以做这样的事情而不会出错?只需在何时何地调用打印功能进行打印。
答案 0 :(得分:0)
我不知道这是合适的解决方案还是优雅的解决方案。 调用其他模块函数时,我尚未测试此代码,但它应该可以工作。 让我知道它是否对您有帮助。
您应该将其添加到主要功能的顶部。
它的作用是在代码上出现单词training时重定向打印输出并停止代码。然后,您可以使用pdb命令查找打印位置。 Pdb文档:https://docs.python.org/3/library/pdb.html
import pdb
import sys
_stdout = sys.stdout
class MyStream(object):
def __init__(self, target):
self.target = target
self.enable_trace = True
def __getattribute__(self, *args, **kargs):
if args[0] in ['write', 'target', 'enable_trace']:
return object.__getattribute__(self, args[0])
else:
return object.__getattribute__(self, 'target').__getattribute__(*args, **kargs)
def write(self, s):
if self.enable_trace and ('training' in s):
self.enable_trace = False
pdb.set_trace()
else:
self.target.write(s)
sys.stdout = MyStream(sys.stdout)
print('test')
print('%s', 'training')
sys.stdout = _stdout # return print to its old behavior
编辑:
稍稍更改了代码,因此它只在首次出现时就停止了,因此不会一直递归地打开调试器。如果要获得以下外观,只需将self.enable_trace设置为True并继续执行代码。