【问题标题】:debugging : where to find the print function调试:在哪里可以找到打印功能
【发布时间】:2019-11-23 07:20:16
【问题描述】:

我手里有一段代码,我正在尝试调试。运行代码时,它会定期打印training loss : x.xxxx secs,但我在代码中找不到这样的行。我需要知道它来自哪里。因此,我想要的是发生一些事情,例如当出现编译错误时,它会回溯到最后一个调用的函数。有没有可能在没有错误的情况下做这样的事情?只是打印调用打印函数的时间和函数。

【问题讨论】:

  • 你最好的办法是在你的 ide 中搜索字符串“training loss”,看起来它会使用字符串格式
  • 我已经这样做了,只是这可能来自一个模块,而且有很多模块要搜索。
  • 那么您将不得不进入兔子洞,您已经知道一个最终到达此打印的入口函数,所以现在只需要逐步完成代码流
  • 您可以使用sys.settrace() 来跟踪对print() 函数的调用,当检测到该函数时,检查它的参数是什么,并在您感兴趣的调用时打印回溯。有关示例,请参见 Tracing a Program As It Runs

标签: python python-3.x


【解决方案1】:

我不知道这是合适的解决方案还是优雅的解决方案。 调用其他模块函数时我没有测试过这段代码,但它应该可以工作。

如果对你有帮助,请告诉我。

你应该把它添加到你的 main 函数的顶部。

它的作用是重定向打印输出并在代码上出现训练一词时停止代码。然后,您可以使用 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 并继续代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多