gpt4 book ai didi

python - 如何使用 sys.settrace 跟踪在全局范围内运行的代码?

转载 作者:行者123 更新时间:2023-12-01 07:55:38 30 4
gpt4 key购买 nike

假设我有一段这样的代码:

import sys

def printer(frame, event, arg):
print(frame, event, arg)
return printer

sys.settrace(printer)
x = 1
sys.settrace(None)

自从

The trace function is invoked (with event set to 'call') whenever a new local scope is entered

上面的代码没有输出任何内容。看我之前的question .

那么有没有一种方法可以在全局范围内跟踪行,例如x = 1

最佳答案

sys.settrace 设置全局跟踪函数。每当进入新的 Python 堆栈帧('call' 事件)时都会调用此跟踪函数,其返回值是新作用域的本地跟踪函数。事件堆栈帧的本地跟踪函数是用于所有其他事件类型的函数。

您需要设置现有堆栈帧的本地跟踪函数,但设置全局跟踪函数并不能帮助您做到这一点。要设置现有框架的本地跟踪函数,您可以手动将框架对象的f_trace属性分配给您想要的函数。例如,设置当前帧的本地跟踪函数:

import sys
sys._getframe().f_trace = whateverfunc

请注意,如果没有全局跟踪函数,则不会调用本地跟踪函数,因此您还需要设置全局跟踪函数。 (这似乎没有记录。)

您可以结合使用sys.settrace和手动f_trace分配来跟踪新的和现有的堆栈帧;例如,在 'return' 事件中,您可以检查要返回的帧的本地跟踪函数,并将该跟踪函数设置为您想要的任何值。 bdb debugger framework source code是如何使用跟踪函数的一个很好的示例。

关于python - 如何使用 sys.settrace 跟踪在全局范围内运行的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55998616/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com