This question already has an answer here:
Python's sys.settrace won't create c_call events
(1个答案)
7年前关闭。
我一直在使用sys.settrace函数为我的程序编写一个跟踪器,该跟踪器工作得很好,除了它似乎没有被诸如open('filename.txt')之类的内置函数调用。似乎没有记录这种行为,所以我不确定我做错了什么还是预期的行为。我将here 中Doug Hellmann的“trace_calls_and_returns”代码用作我的跟踪功能。
如果我无法使用settrace进行此操作,是否有任何方法可以跟踪对open()的调用?
我不想使用Linux的strace,因为它将在整个程序中运行(而不仅仅是我要跟踪的部分),并且不会显示python行号/文件名等。
我考虑的另一个选项是通过包装器对开放函数进行猴子修补,例如:
但这对我来说很脆弱。
有人可以建议一种更好的方法吗?
(1个答案)
7年前关闭。
我一直在使用sys.settrace函数为我的程序编写一个跟踪器,该跟踪器工作得很好,除了它似乎没有被诸如open('filename.txt')之类的内置函数调用。似乎没有记录这种行为,所以我不确定我做错了什么还是预期的行为。我将here 中Doug Hellmann的“trace_calls_and_returns”代码用作我的跟踪功能。
如果我无法使用settrace进行此操作,是否有任何方法可以跟踪对open()的调用?
我不想使用Linux的strace,因为它将在整个程序中运行(而不仅仅是我要跟踪的部分),并且不会显示python行号/文件名等。
我考虑的另一个选项是通过包装器对开放函数进行猴子修补,例如:
import traceback, __builtin__
def wrapped_open(*arg,**kw):
print 'open called'
traceback.print_stack()
f = __builtin__.open(*arg,**kw)
return f
open = wrapped_open
但这对我来说很脆弱。
有人可以建议一种更好的方法吗?
最佳答案
您将无法跟踪导入到python和 open()
is not pure python, it's a C binding from CPython part of the Python distribution中的编译代码。
因此,您必须在open()
中进行跟踪的唯一方法是使用strace
或等效的代码,但无论如何,要超越python可以自我反省的范围。