如何在python中跟踪内置函数

时间:2016-11-18 10:34:37

标签: python debugging pdb

我试图了解如何在文件上下文管理器中调用__enter____exit__方法。

with open("test.txt") as fp:
  fp.read()

我在pdb中尝试了step命令 - 而不是定义函数open,它只是执行它并继续前进到下一行。

我也尝试使用sys.settrace(),但即使它没有捕获任何事件中的函数调用open__enter____exit__

当然,这适用于从其他模块和同一模块导入的函数。我假设这应该以类似的方式开箱即用这些内置函数。我找不到任何指向此的文档。是否有可能进入或跟踪内置函数的执行?

使用Python 2.7。

1 个答案:

答案 0 :(得分:3)

在跟踪内置函数时,尝试使用sys.setprofile代替sys.settrace

系统的配置文件函数的调用方式与系统的跟踪功能类似(请参阅settrace()),但是会使用不同的事件来调用,例如,不会为每一行已执行的代码调用它(仅在调用和返回时,但即使设置了异常,也会报告返回事件)

除了事件“ call”和“ return”之外,setprofile还提供了“ c_call”和“ c_return”,它们表示从内置函数进行调用和返回。

请注意其他两个参数framearg的含义有所改变:
如果event等于“ c_call”或“ c_return”,则frame是调用内置函数的外部框架,因此frame.f_code.co_name不是内置函数的名称,而是名称调用它的python函数。 相反,arg是C函数对象,而不是返回值。

所以回答您的问题:

是否可以介入或跟踪内置函数的执行?

是的,可以跟踪内置函数的调用/返回,但是,您不能单步执行。我猜您之所以在调试器中什至看不到c_call / c_return的原因是因为它使用的是settrace而不是setprofile。

相关问题