【问题标题】:Python: Internal Information of Function calls and Automated LoggingPython:函数调用和自动记录的内部信息
【发布时间】:2013-08-21 17:12:33
【问题描述】:

我想编写一个类来显示当前工作功能的树,这意味着:

假设我有函数 A 先调用函数 B,然后函数 C,函数 C 调用函数 D。在时间 t = 1,B 正在运行,所以我希望标准输出为:

Root: function A -> running properly, called B
2-nd: function B -> running properly

在时间 t = 2 时,B 又回到了 A,所以 stdout 变为:

Root: function A -> running properly, B returned

在时间 t = 3,A 调用了 C。在时间 t = 4,C 调用了 D。标准输出应该是:

Root: function A -> running properly, B returned, called C
2-nd: function C -> running properly, called D
3-rd: function D -> running properly

在时间 t = 5,D 返回。在时间 t = 6,C 返回。标准输出应该是:

Root: function A -> running properly, B returned, C returned

在时间 t = 7,函数 A 返回:

Root: function A -> Done

除了创建一个记录器对象并传递它之外,有没有更优雅的方法来自动化它?如果 A 或 B 是多线程进程怎么办?

非常感谢任何建议。谢谢!

【问题讨论】:

  • 你看过inspect模块吗?您已经可以从那里获取堆栈和跟踪。
  • 我没见过。当我读到它时,也许它是可用的。然而,我想要一种干净的记录方式。如果我使用检查,似乎我必须在每个函数调用之前调用一组函数来获取信息。这将与 logger 对象相同,只是它是内置的并且很棒。

标签: python logging build-automation


【解决方案1】:

看看 Python 中的trace module。您可以使用此模块生成带注释的跟踪报告

trace 模块在 Python 文档中的定义:

跟踪模块允许您跟踪程序执行、生成带注释的语句覆盖列表、打印调用者/被调用者关系以及列出程序运行期间执行的函数。它可以在另一个程序或命令行中使用。

【讨论】:

  • 感谢您的建议!是否可以通过覆盖任何函数在打印之前修改日志输出?我在帖子中没有提到,但我希望输出根据我的需要灵活,这将成为稍后的第二个问题。
  • @Mai 我不完全确定这是否可以做到。我仔细研究了一下,发现这篇文章详细介绍了如何将跟踪用于代码覆盖率分析和跟踪调用:doughellmann.com/2008/10/pymotw-trace.html。我猜,trace命令本身的输出可以解析并渲染成想要的格式?
猜你喜欢
  • 2021-06-25
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2011-08-11
  • 2017-12-06
相关资源
最近更新 更多