5

我一直在使用 sys.settrace 函数为我的程序编写跟踪器,它工作得很好,只是它似乎没有被内置函数调用,比如 open('filename.txt')。这种行为似乎没有记录在案,所以我不确定我是否做错了什么,或者这是否是预期的行为。我在这里使用 Doug Hellmann 的“trace_calls_and_returns”代码作为我的跟踪功能。

如果我不能用 settrace 做到这一点,有没有办法跟踪对 open() 的调用?我不想使用 Linux 的 strace,因为它会为整个程序运行(不仅仅是我想要跟踪的部分)并且不会显示我的 python 行号/文件名等。我考虑的另一个选项是通过包装器对 open 函数进行猴子修补,例如:

import traceback, __builtin__
def wrapped_open(*arg,**kw): 
        print 'open called' 
        traceback.print_stack() 
        f = __builtin__.open(*arg,**kw) 
        return f 
open = wrapped_open 

但这对我来说似乎很脆弱。

有人可以提出更好的方法吗?

4

1 回答 1

3

您将无法跟踪导入到 python 中的编译代码,并且open()不是纯 python,它是来自 Python 发行版的 CPython 部分的 C 绑定

因此,您必须在其中进行追踪的唯一方法open()是寻找strace或等效的方法,但无论如何,都要超越 python 可以自省的范围。

于 2013-07-01T02:46:04.783 回答