调试:在哪里可以找到打印功能

时间:2019-07-14 07:16:54

标签: python python-3.x

我手中有一个要调试的代码。在运行代码时,它会定期打印training loss : x.xxxx secs,但在代码中找不到这样的行。我需要知道它的来源。因此,我希望发生的事情是发生的,例如当发生编译错误时,它会追溯到最后一个被调用的函数。是否可以做这样的事情而不会出错?只需在何时何地调用打印功能进行打印。

1 个答案:

答案 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并继续执行代码。