如何在python中跟踪内置函数

问题描述 投票:0回答:1

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

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

我在pdb中尝试了step命令-而不是去定义函数open,它只是执行它并移至下一行。

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

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

使用Python 2.7。

python debugging pdb
1个回答
2
投票

[跟踪内置函数时尝试使用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。

© www.soinside.com 2019 - 2024. All rights reserved.